使用Python和子进程Popen

6
我正在努力使用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_command("insert command here"),但是并没有任何作用。

关于第二个问题,我认为答案应该类似于这里: Running shell command from Python and capturing the output, 但由于我无法让第一个问题解决,所以我还没有尝试过。

2个回答

8

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

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

7
你可以使用专门用于与基于shell的程序交互的模块Pexpect
例如,启动scp命令并等待密码提示符,您可以执行以下操作:
child = pexpect.spawn('scp foo myname@host.example.com:.')
child.expect ('Password:')
child.sendline (mypassword)

请查看Pexpect-u,以获取Python 3版本。


2
只是补充一下,据我所知,subprocess模块确实更适用于运行其初始输入然后完成的任务(例如调用函数)。如果您需要进行持续的来回交互(例如用于交互式终端实用程序),那么Pexpect 绝对 是最好的选择。 - TimStaley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接