将参数发送到已在Python 3中打开的程序

时间:2016-05-31 06:27:41

标签: python python-3.x subprocess communication popen

我想要做的是在这里更好地解释:Sending to the stdin of a program in python3

我试图在程序打开时向程序发送参数,例如:

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']

等..

我是否正确地使用了subprocess.Popen.communicate()或者是其他的东西?

请帮忙!

-Thanks

2 个答案:

答案 0 :(得分:1)

在程序启动后,您无法更改命令行参数,即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

更好的选择是导入模块并使用其功能。见Call python script with input with in a python script using subprocess

答案 1 :(得分:0)

这不是进程间通信的工作方式。您正在使用标准输入管道混合命令行参数。

这将有效:

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')