我正在尝试编写一个启动子进程的python脚本,并写入子进程stdin。是否对输出进行了一些测试,然后将更多命令写入stdin。
我试过了:
def get_band():
print "band"
p = subprocess.Popen(["/path/to/program","-c","-"], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
ran_stdout = p.communicate(input='show status')[0]
print(ran_stdout)
然而,print语句给出:
Unable to connect at 127.0.0.1, Connection refused.
我想知道我这样做是否合适?这是关于我正在尝试运行的过程的文档。我想使用最后一个选项。
Running the tool from the Linux shell allows additional options, depending on the options given to the command. The options are as follows:
-h Displays help about the command
-c <Filename> Instead of taking typed commands interactively from a user the commands are read from the named file, i.e. in batch mode. When all commands are processed the CLI session ends automatically.
-c - As above but reads command from Linux stdin. This allows commands to be ‘piped’ to the program.
答案 0 :(得分:1)
如果您能告诉我们有关该计划的更多信息,也许知道该计划的人可能会尝试更好地解释它的运作方式。
然而,你描述了什么
启动子进程,并写入子进程stdin。是否对输出进行了一些测试,然后将更多命令写入stdin。
与您的代码不符。
您的代码会在我们自己的标准输出中显示内容,显示band
,然后与子流程进行“一次性”通信。
要明确这一点,p.communicate()
将所有内容写入子进程,关闭其stdin并从stdout和stderr读取它所获得的内容。
因此它与你想要的东西不相容:写,读,写。
所以你必须自己制作它。
如果您编写的块足够小以保证适合管道缓冲区,则很简单:只需编写命令(不要忘记尾随\n
)并阅读。
但请注意!不要阅读比你真实的更多,否则你的阅读可能会阻止。
因此,使用非阻塞IO或select.select()
。
如果您需要有关这一主题的更多信息,请在此处提供其他答案,其中涵盖了这些主题。前几天我写了one which might help you。
答案 1 :(得分:0)
这是因为某种原因,在同一行传递命令。然后为我想要的每个命令调用此函数。
p = subprocess.Popen(["/path/to/program", '-c', '-', cmd_here],
stdout=subprocess.PIPE)
proc_stdout, proc_stderr = proc.communicate()
proc.wait()
#print stuff