あなたはbashで、または何らかの二方向パイプでperlでコプロセッサを使いたいでしょう。 Pythonでは、os.popen2コマンドを使用できます。 perl also has facilities for interacting with subprocesses over pipes。しかし、のように、可能であれば、DBD::Pg
またはpsycopg2
のような母国語のデータベースドライバを使用する方がよいでしょう。
シェルでこれを行う必要がある場合は、「info bash」を参照して「コプロセッサ」を検索してください。
ここでは、簡単にデモ用bashスクリプトを使用して始めます。
#!/bin/bash
set -e -u
DBNAME=whatever_my_db_is_called
coproc psql --quiet --no-align --no-readline --tuples-only -P footer=off --no-password "$DBNAME"
echo 'SELECT pg_backend_pid();' >&${COPROC[1]}
read -u ${COPROC[0]} backend_pid
echo "Backend PID is: ${backend_pid}"
echo "SELECT random();" >&${COPROC[1]}
read -u ${COPROC[0]} randnum
echo "\q" >&${COPROC[1]}
wait %1
echo "Random number ${randnum} generated by pg backend ${backend_pid}"
PSQLへの引数は、それが入力のために一時停止していないことを確認するために、readlineのコマンドとしてタブまたはmetacharsを解釈し、それがシェル上と対話する方が簡単ですので、ないきれいなプリント出力を行いますされませんされています。
psqlはまったく必要ないかもしれませんが、何らかのスクリプトを使ってPostgreSQLサーバと対話するだけでよいでしょう。そうであれば、PostgreSQLデータベースインターフェイスでスクリプト言語を使うだけで簡単に簡単に行えます。 Pythonでは、たとえば:
#!/usr/bin/env python
import os
import sys
import psycopg2
def main():
conn = psycopg2.connect("dbname=classads")
curs = conn.cursor()
curs.execute("SELECT pg_backend_pid();");
pid = curs.fetchall()[0][0]
# Do whatever you need to here,
# like using os.system() or os.popen() or os.popen2() to talk to
# system commands, using curs.execute() to talk to the database, etc.
conn.close();
if __name__ == '__main__':
main()
Perlでは、同様の効果を得るためにDBIとDBD :: Pgを使用できます。
実際に何をしようとしていますか? bin/psqlはperlスクリプトと何が関係していますか? – Flimzy