Python subprocess.Popen для нескольких python скриптов - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь понять метод Popen. В настоящее время у меня есть три файла python в одном каталоге: test.py, hello.py и bye.py. test.py - это файл, содержащий метод subprocess.Popen, в то время как hello и bye - это простые файлы hello world и goodbye world, т.е. они содержат только один отпечаток.

если я это сделаю:

import subprocess
from subprocess import PIPE

tst = subprocess.Popen(["python", "hello.py"], stdout=PIPE, stderr=PIPE)
(out,err) = tst.communicate()

Кажется, все работает нормально, получая в оболочке правильную печать «Hello World» для hello.py и делая то же самое для bye.py, оболочка печатает «GoodBye World», как и должно.

Проблема запускается, когда я хочу запустить оба файла,

import subprocess
from subprocess import PIPE

tst = subprocess.Popen(["python", "hello.py", "python", "bye.py"], stdout=PIPE, stderr=PIPE)
(out,err) = tst.communicate()

Это вернет только печать для первого файла .py, а затем вернет

[WinError 2 ] The system cannot find the file specified

Это произойдет, если я также удалю второй «python». Почему это происходит?

1 Ответ

0 голосов
/ 28 мая 2020

Это произойдет, если я также удалю второй «python». Почему это происходит?

Бег

subprocess.Popen(["python", "hello.py", "python", "bye.py"]

сродни бегу

$ python hello.py python bye.py

, что на самом деле не имеет большого смысла, поскольку это интерпретируется как передача аргументов hello.py python bye.py в python.

Итак, это часть 1, на ваш вопрос «Я пытаюсь понять метод Popen».

Не зная, что вы на самом деле хотите сделать с этим доказательством концепции, у вас есть несколько вариантов; вызовите несколько Popen() последовательно или используйте точку с запятой с shell=True, но обязательно учтите последствия для безопасности этого:

# This will also break on Windows
>>> import subprocess as sp
>>> sp.check_output("python -V ; python -V", shell=True)
b'Python 3.8.2\nPython 3.8.2\n'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...