2017-11-07 11 views
3

無効なパスワードを入力した場合、正しいパスワードを入力するようにスクリプトのユーザーに指示するようにしています。私はこれがpsqlの設定か、pythonでのエラー処理を使って行われたかどうかはわかりません。どちらを使うのですか?次のように私の現在のコードは次のとおりです。複数のパスワード試行pg_dump python

backup_ps = subprocess.Popen(
    ['pg_dump','-h', ORIGIN_DB, '-U', ORIGIN_DB_USER, ORIGIN_DB_NAME, '-f', destination, '-c', 
    '-t', 'table1', 
    '-Fp', '--inserts'], 
    stdout=subprocess.PIPE 
) 

output = backup_ps.communicate()[0] 

# if password incorrect, prompt for correct password. 

答えて

1

私はFreeBSD上でpostgresql96を実行しています。私は不正なパスワードを入力するとpg_dumpの戻りコードは、むしろ0

よりも、1である素朴な解決策は、このようなwhileループでコードを置くために、次のようになります。

while True: 
    backup_ps = subprocess.Popen(
     ['pg_dump','-h', ORIGIN_DB, '-U', ORIGIN_DB_USER, ORIGIN_DB_NAME, '-f', destination, '-c', 
      '-t', 'table1', 
      '-Fp', '--inserts'], 
     stdout=subprocess.PIPE 
    ) 

    output = backup_ps.communicate()[0] 
    if backup_ps.returncode == 0: 
     break 

問題はpg_dumpですメモリやディスク領域を割り当てるシステムコールが失敗した場合を含め、エラーが発生したときに1を返す可能性があります。したがって、実際にパスワード入力が失敗したことを意味するわけではなく、nが何か他のものを試してみたり使用したりした後、正常に戻ることなくフックを終了させたいかもしれません。

もう1つの解決策は、ダンプ出力ファイルが存在し、最近修正されたかどうかを確認することです。また、不正なパスワードについてのエラーメッセージをstderrで調べることもできます。

私はこれらのソリューションはハックだと思います。

ベスト・ソリューション(AFAICT)はダンプを行うために別のプロセスを使用しないことです(そのプロセスと通信するのは厄介なことがあるため)psycopg2のようなPythonライブラリを使用してデータベースにアクセスします。

+0

ありがとう、これはトリックでした、私は復帰コードと関係があるかもしれないという気持ちがありました – seus

+0

クール、そして元の汚れを残念に残念。私はCとRubyでも書いているので、時には真ではなく真を書いたり、マニアのようなステートメントの最後にセミコロンを入れたりします。 –

+0

haha​​h問題はありません!、私はPythonのnoobのビットです。 Java dev dev myself – seus

関連する問題