В Python подпроцесса.Popen С Оболочкой=True. Дождитесь завершения
представления комплекса cmd строка из полного пути к исполняемому файлу, несколько флагов, аргументов, параметров, входов и выходов, похоже, требуют, чтобы я установил shell=True иного подпроцесса.Popen не может понять ничего более сложного, чем простой путь к исполняемому файлу (без пробелов в пути к файлу).
в моем примере у меня довольно длинный cmd:
cmd = " '/Application/MyApp.app/Contents/MacOS/my_executable' '/Path/to/input/files' -some -flags -here -could -be -a -lot '/full/path/to/output/files' "
отправка этого cmd в подпроцесс.К popen " приводит к ошибке, которая жалуется на что-то о пути и не будучи в состоянии найти его.
поэтому вместо использования:
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
check_call кажется работает довольно хорошо:
proc = subprocess.check_call(cmd, shell=True)
интересно, только после shell установлено значение правда
shell=True
на подпроцесс.check_call работает с поставляемым cmd.
побочный эффект это остальная часть кода, похоже, продолжается, не дожидаясь подпроцесс.check_call (cmd, shell=True) чтобы финишировать первым.
код разработан таким образом, что остальная часть выполнения зависит от результата subprocess.check_call(cmd, shell=True)
.
интересно, есть ли в любом случае принудительное выполнение кода, чтобы дождаться подпроцесса.check_call(УМК, оболочки=True) является готовой. Заранее спасибо!
3 ответов
как @mikkas предлагают просто использовать его как list
вот пример:
mainProcess = subprocess.Popen(['python', pyfile, param1, param2], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# get the return value from the method
communicateRes = mainProcess.communicate()
stdOutValue, stdErrValue = communicateRes
вы призываете python.exe pyfile param1 param2
С помощью communicate()
вы можете узнать stdout
и stderr
как Tuple
вы можете использовать метод python split()
чтобы разделить строку на список, например:
cmd = "python.exe myfile.py arg1 arg2"
cmd.split(" ")
выход:
['python.exe', 'myfile.py', 'arg1', 'arg2']
Я думаю, что функция check_call должна ждать завершения команды.
см. здесь документы http://docs.python.org/2/library/subprocess.html
проверка вызова не ждет. Вам нужен такой процесс.wait () и явно проверьте код возврата, чтобы получить нужный функционал.
Process = subprocess.Popen('%s' %command_string,stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
Process.wait()
if Process1.returncode!=0:
print Process1.returncode
sendMail()
return
else:
sendMail()