使用python和子进程Popen

时间:2013-01-21 12:40:19

标签: python subprocess

我正在努力使用python的子进程。这是我的任务:

  1. 通过命令行启动api(这应该与在命令行上运行任何参数没什么不同)
  2. 验证我的API已启动。最简单的方法是轮询标准。
  3. 针对API运行命令。当我能够运行新命令时出现命令提示符
  4. 通过轮询标准输出验证命令完成(API不支持日志记录)
  5. 到目前为止我的尝试:
    我被困在这里使用了Popen。我明白,如果我使用 subprocess.call("put command here")这有效。我想尝试使用类似的东西:

    import subprocess
    
    def run_command(command):
      p = subprocess.Popen(command, shell=True,
                           stdout=subprocess.PIPE,
                           stderr=subprocess.STDOUT)
    

    我使用run_command("insert command here"),但这没有任何作用。

    关于2.我认为答案应该与此类似: Running shell command from Python and capturing the output, 但由于我无法工作,我还没有尝试过。

2 个答案:

答案 0 :(得分:7)

至少要真正启动子进程,你必须告诉Popen对象真正进行通信。

def run_command(command):
    p = subprocess.Popen(command, shell=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT)
    return p.communicate()

答案 1 :(得分:6)

您可以查看Pexpect,这是专为与基于shell的程序进行交互而设计的模块。

例如,启动scp命令并等待密码提示,您可以执行以下操作:

child = pexpect.spawn('scp foo myname@host.example.com:.')
child.expect ('Password:')
child.sendline (mypassword)

有关Python 3版本的信息,请参阅Pexpect-u