2

psycopg2 モジュールを使用してローカルの PostgreSQL サーバーにアクセスし始めたところです。サーバーを起動しようとしたときにプログラムがエラーを処理できるように、サーバーが既に起動しているかどうかをプログラムで確認する方法が必要です。

psqldir = 'C:/Program Files/PostgreSQL/9.2/bin'    # Windows
username = os.environ.get('USERNAME')
dbname = 'mydb'
os.chdir(psqldir)
os.system('pg_ctl start -D C:/mydatadir')   # Error here if server already started
conn = psycopg2.connect('dbname=' + dbname + ' user=' + username)
cur = conn.cursor()

私は少し実験しましたが、これは「0」または「3」を返し、私の問題を解決するようですが、これが文書化された動作であるかどうかを確認する PostgreSQL/psycopg2 マニュアルに関する情報は見つかりませんでした:

server_state = os.system('pg_ctl status -D C:/mydatadir')

最善の方法は何ですか?ありがとう!

4

2 に答える 2

4

から: _pg_ctl documentation

-w

起動またはシャットダウンが完了するまで待ちます。待機はシャットダウンのデフォルトのオプションですが、起動のオプションではありません。起動待ちの間、pg_ctl は繰り返しサーバーへの接続を試みます。シャットダウンを待っているとき、pg_ctl はサーバーが PID ファイルを削除するのを待ちます。pg_ctl は、起動またはシャットダウンの成功に基づいて終了コードを返します。

また、次のこともpg_ctl status役に立ちます。

statusモードは、サーバーが指定されたデータ ディレクトリで実行されているかどうかを確認します。存在する場合は、それを呼び出すために使用された PID とコマンド ライン オプションが表示されます。サーバーが実行されていない場合、プロセスは終了ステータス 3 を返します。

于 2013-04-20T10:08:04.243 に答える
0

pgrep コマンドを使用してみてください。

proc = subprocess.Popen(["pgrep -u postgres -f -- -D"], stdout=subprocess.PIPE, shell=True)
    (out, err) = proc.communicate()
    try:
        if int(out) > 0:
            return True
    except Exception as e:
        return False
于 2021-10-13T08:13:34.843 に答える