2016-12-05 49 views
0

我有一個非常奇怪的錯誤。我使用psql將大量數據加載到PG數據庫。我的代碼中的一個函數全部加載。我的代碼庫的一部分調用加載函數,它工作得很好。另一部分使用不同的數據調用相同的函數),並且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

所以,事實證明,我在複製之前鎖定了表格,並且由於副本在不同的進程中運行,所以看到一個鎖定的表格可以寫入並掛起。