Python与子进程交互

时间:2017-02-11 07:41:17

标签: python subprocess

我想与流程互动。 我可以开始这个过程并打印出前两行(类似于'流程已成功启动')。 现在我想向进程发送一个新命令,该命令应该再次返回类似' command done'但没有任何反应。

请帮帮我。

import subprocess

def PrintAndPraseOutput(output, p):
    print(output)
    if 'sucessfully' in output:
        p.stdin.write('command')

cmd = ["./programm"]
p = subprocess.Popen(cmd, universal_newlines=True, shell=False, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
while p.poll() is None:
    output = p.stdout.readline()
    PrintAndPraseOutput(output, p)

更新: 同样的问题,'流程成功启动后没有输出'

import subprocess

def print_and_parse_output(output, p):
    print(output)
    if 'successfully' in output:
        p.stdin.write('command\n')


with subprocess.Popen(["./programm"], universal_newlines=True, shell=False, stdout=subprocess.PIPE, stdin=subprocess.PIPE) as proc:
    while proc.poll() is None:
        output = proc.stdout.readline()
        print_and_parse_output(output, proc)

1 个答案:

答案 0 :(得分:0)

您的I / O应该是行缓冲的,因此PrintAndPraseOutput应该在字符串的末尾发送'\n'

顺便说一句,你有几个拼写错误。该函数应命名为print_and_parse_output以符合PEP-0008,“成功”应具有2个c。

def print_and_parse_output(output, p):
    print(output)
    if 'successfully' in output:
        p.stdin.write('command\n')

当像这样使用subprocess时,最好将它放在with语句中。来自the subprocess.Popen` docs

  

通过with支持Popen对象作为上下文管理器   声明:退出时,标准文件描述符被关闭,并且   过程等待。

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())