2016-12-05 4 views
0

У меня очень странная ошибка. Я загружаю большие объемы данных в базу данных PG с использованием psql. Одна функция в моем коде делает ВСЕ нагрузки. Одна часть моей кодовой базы вызывает функцию загрузки, и она работает JUST fine. Другая часть вызывает ту же функцию с разными данными), а вызов подпроцесса 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 вручную в команде line, а затем скопируйте и вставьте команду в ошибку в командную строку, она работает нормально и быстро, завершается и возвращается после завершения.

Как я уже говорил, этот код работает при вызове из другой части моего приложения в другую таблицу с разными данными.

Любая идея, что может привести к сбою при вызове с python, пока она все еще работает в командной строке?

Windows 10 Pro, Py3.5, PG 9.4, pg8000 db module.

ответ

0

Итак, оказывается, что я блокировал таблицу перед копией, а поскольку копия запускается в другом процессе, она видит, что заблокированная таблица записывается и висит.

Смежные вопросы