使用python和子进程Popen

str*_*tar 6 python subprocess

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

  1. 通过命令行启动api(这应该与在命令行上运行任何参数没有什么不同)
  2. 验证我的API已经出现.最简单的方法是轮询标准.
  3. 针对API运行命令.当我能够运行新命令时,会出现命令提示符
  4. 通过轮询标准输出来验证命令是否完成(API不支持日志记录)

到目前为止我的尝试:
1.我被困在这里使用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 Code Online (Sandbox Code Playgroud)

我在哪里使用,run_command("insert command here")但这没有任何作用.

关于2.我认为答案应该类似于这里: 从Python运行shell命令并捕获输出,但由于我无法工作,我还没有尝试过.

Tho*_*anz 8

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

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


Cha*_*esB 7

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

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

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

有关Python 3版本,请参阅Pexpect-u.

  • 只是添加AFAICT,子进程模块实际上是针对使用初始输入运行然后完成的任务(比如调用函数).如果您需要来回(例如,对于交互式终端实用程序),那么Pexpect绝对是*可行的方式. (2认同)