Мне нужно запустить внешний скрипт (это невозможно изменить), чтобы управлять данными CLOB и вставлять их в таблицу. Но если я использую os.system
в цикле, в таблицу вставляется только 1 запись, если я добавляю time.sleep(20)
между вызовами, все работает нормально.
Я пытаюсь использовать подпроцесс, но инструкция очень большая и команда возвращает Errno 36 filename too long
.
В этом случае была вставлена только последняя запись:
for element in list:
query = 'INSERT IN TABLE1 VALUES(<clob>)'
rc = os.system('externalScript.py -q "' + query.encode('utf-8') + '"')
В этом случае подпроцесс возвращает filename too long
:
for element in list:
query = 'INSERT IN TABLE1 VALUES(<clob>)'
proc = subprocess.Popen(['python', 'externalScript.py -q "' + query.encode('utf-8') + '"' ], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
Есть ли решение без добавления time.sleep(20)
после os.system
?
import externalScript
использовать его без вызова подпроцесса? - person ex4   schedule 04.03.2021os.system()
по определению уже ждет завершения внешнего процесса. - person tripleee   schedule 04.03.2021subprocess.Popen(['python', 'externalScript.py', '-q', query], text=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
, но на самом деле не используйте здесьPopen()
; переключиться наsubprocess.check_call
или, возможно,subprocess.call
илиsubprocess.run(..., check=True)
... за исключением, конечно, запуска Python в качестве подпроцесса, как правило, также неправильно. Простоimport externalScript
(возможно, вам нужно будет его отрефакторить) и вызовите его основную функцию прямо из текущего скрипта. - person tripleee   schedule 04.03.2021subprocess.call
не получится, потому что у вас все еще есть синтаксическая ошибка, которую необходимо исправить. Если ваш аргумент достаточно длинный, чтобы вызвать это предупреждение, вероятно, было бы лучше, если бы вы могли заставить скрипт читать файл или стандартный ввод. - person tripleee   schedule 04.03.2021