我试图做的在这里得到了更好的解释:发送到python3中程序的stdin
。我正在尝试在程序打开时向程序发送参数,例如:
rec.py
import sys
import time
while True:
print(sys.argv)
time.sleep(1)
send.py
import subprocess
program = Popen(['python.exe', 'rec.py', 'testArg'])
a = input('input: ')
a.communicate(b)
我希望能够运行 send.py 并输入我的输入。假设我的输入是"cat",我希望运行时输出看起来像这样 send.py
['rec.py', 'testArg']
['rec.py', 'testArg']
['rec.py', 'testArg']
cat <------- My input
['rec.py', 'testArg', 'cat']
['rec.py', 'testArg', 'cat']
['rec.py', 'testArg', 'cat']
['rec.py', 'testArg', 'cat']
等。。
我是否正在使用子流程。Popen.communication() 不正确还是别的什么?
请帮忙!
-谢谢
程序启动后,您无法更改命令行参数,即sys.argv
只能从进程本身的内部(通常)进行更改。
Popen.communicate(input=data)
可以通过其标准输入将data
发送到子进程(如果将stdin=PIPE
传递给Popen()
)。 .communicate()
在返回之前等待进程退出,因此它可用于一次发送所有输入。
要以增量方式发送输入,请直接使用 process.stdin
:
#!/usr/bin/env python3
import sys
import time
from subprocess import Popen, PIPE
with Popen([sys.executable, 'child.py'],
stdin=PIPE, # redirect process' stdin
bufsize=1, # line-buffered
universal_newlines=True # text mode
) as process:
for i in range(10):
time.sleep(.5)
print(i, file=process.stdin, flush=True)
其中child.py
:
#!/usr/bin/env python3
import sys
for line in sys.stdin: # read from the standard input line-by-line
i = int(line)
print(i * i) # square
更好的选择是导入模块并改用其函数。请参阅使用 subprocess
这不是进程间通信的工作方式。您正在将命令行参数与标准输入管道混合在一起。
这将起作用:
rec.py:
import sys
import time
arguments = list(sys.argv)
while True:
print(arguments)
arguments.append(next(sys.stdin))
send.py
import subprocess
program = subprocess.Popen(['python.exe', 'rec.py', 'testArg'], stdin=subprocess.PIPE)
a = input('input: ')
program.stdin.write(a + 'n')