2016-12-05 57 views
0

私は非常に奇妙なエラーがあります。 psqlを使用して大量のデータをPGデータベースにロードします。私のコードの1つの関数は、すべての負荷を行います。私のコードベースの1つの部分がload関数を呼び出し、それはうまく動作します。別の部分は異なるデータで同じ関数を呼び出します)、psqlのサブプロセス呼び出しがハングします(タイムアウトはそれを終了させる必要があります)。コマンドラインから同じコマンドを実行すると、うまく動作します:ここでPythonサブプロセスを使ったタイムアウト

は私のコードです:

myEnv = os.environ.copy() 
myEnv["PGPASSWORD"] = <<db password>> 

output = None 
output = subprocess.check_output(popenArgs, stderr=subprocess.STDOUT, timeout=120, env=myEnv) 

タイムアウトエラーがある:

Traceback (most recent call last): 
    File "C:\Data\Dropbox\Engagements\<Client>\Src\prod_db.py", line 102, in _copyFrom 
    output = subprocess.check_output(popenArgs, stderr=subprocess.STDOUT, timeout=120, env=myEnv) 
    File "C:\Tools\WinPython-64bit-3.5.1.3\python-3.5.1.amd64\lib\subprocess.py", line 629, in check_output 
    **kwargs).stdout 
    File "C:\Tools\WinPython-64bit-3.5.1.3\python-3.5.1.amd64\lib\subprocess.py", line 703, in run 
    stderr=stderr) 
subprocess.TimeoutExpired: Command '"C:/Program Files/PostgreSQL/9.4/bin/psql.exe" -h <<DB LOCATION>> -p 5432 -d forecast_dev -U forecast -v ON_ERROR_STOP=1 -AtXwa -c "\copy di_entities_load from C:\Users\Marc\AppData\Local\Temp\copytempdi_entities_load7.csv with csv"' timed out after 120 seconds 

私はコマンドで手動PGPASSWORD変数を設定した場合エラーのコマンドをコピーしてコマンドラインに貼り付けると、正常に実行され、すばやく実行され、完了して終了して戻ります。

私が言ったように、このコードは、アプリケーションの別の部分から別のテーブルに、別のデータで呼び出されたときに機能します。

pythonから呼び出されたときにこれが失敗する原因は何でしょうか?それでもコマンドラインでは動作しますか?

Windows 10 Pro、Py3.5、PG 9.4、pg8000 dbモジュール。

答えて

0

コピーする前にテーブルをロックしていて、コピーが別のプロセスで実行されているため、ロックされたテーブルが書き込みおよびハングすることがわかりました。

関連する問題