В 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()