2016-12-05 7 views
0

Ich habe einen sehr seltsamen Fehler. Ich lade große Datenmengen mit psql in eine PG-Datenbank. Eine Funktion in meinem Code führt ALLE Lasten aus. Ein Teil meiner Codebasis ruft die Ladefunktion auf, und es funktioniert JUST gut. Ein anderer Teil ruft die gleiche Funktion mit verschiedenen Daten auf, und der Unterprozessaufruf psql hängt (Timeout muss ihn beenden). Das Ausführen des gleichen Befehl von der Kommandozeile funktioniert gut:Timeout mit Python-Subprozess

Hier mein Code:

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

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

Der Timeout-Fehler ist:

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 

Wenn ich den PGPASSWORD Variable manuell in einem Befehlssatz Zeilenfenster, und kopieren Sie dann und fügen Sie den Befehl in den Fehler in die Befehlszeile, es läuft gut und schnell, Beenden und Zurückkehren nach Abschluss.

Wie bereits erwähnt, funktioniert dieser Code, wenn er von einem anderen Teil meiner Anwendung aufgerufen wird, in eine andere Tabelle mit anderen Daten.

Eine Idee, was würde dazu führen, dass dies fehlschlägt, wenn von Python aufgerufen wird, während es immer noch in der Befehlszeile funktioniert?

Windows 10 Pro, Py3.5, PG 9.4, pg8000 db-Modul.

Antwort

0

Es stellt sich also heraus, dass ich die Tabelle vor der Kopie gesperrt habe, und da die Kopie in einem anderen Prozess ausgeführt wird, sah sie eine gesperrte Tabelle zum Schreiben und Hängen.