使用subprocess popen运行列表命令字符串并获取输出

3
我正在尝试在Python脚本中运行多个UNIX命令,像这样:
import subprocess


cmds = ['sleep 3', 'uptime','time ls -l /']


p = subprocess.Popen(cmds,stdout=subprocess.PIPE,shell=True)


while p.poll() is None:
    time.sleep(0.5)


tempdata = p.stdout.read()



print(tempdata)

然而我的输出并没有包含所有的输出,并且似乎也没有运行所有的命令。将shell=False设置为False也会导致错误。

Traceback (most recent call last):
  File "task1.py", line 32, in ?
    p = subprocess.Popen(commands,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)
  File "/usr/lib64/python36/subprocess.py", line 550, in __init__
    errread, errwrite)
  File "/usr/lib64/python36/subprocess.py", line 996, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
3个回答

3

当你创建一个新进程时,你不需要传递给它要运行的命令列表;相反,你只需要传递一个单一的命令 -- 可以是一个字符串(使用shell=True),或者是一个参数列表(使用shell=False)。

import subprocess

cmds = ['sleep 1', 'uptime', 'ls -l /']

for cmd in cmds:
    stdout = subprocess.check_output(cmd, shell=True)
    print('\n# {}'.format(cmd))
    print(stdout)

如果只想收集标准输出,subprocess.check_output()可能比Popen()更简单 - 但是根据您需要对进程执行的操作而定,两种方法都可以使用。

1
要运行所有这些,请执行以下操作:

cmds = ['sleep 3', 'uptime','time ls -l /']

你需要为它们中的每一个调用popen:
for cmd in cmds:
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)

    while p.poll() is None:
        time.sleep(0.5)

    output = p.stdout.read()

更简单的说:

for cmd in cmds:
    output = subprocess.check_output(cmd, stdout=subprocess.PIPE, shell=True)

第二个问题:这会捕获所有写入标准输出的输出。如果要捕获stderr,请将其重定向到subprocess.PIPE

1

您的问题是“sleep 3”导致了回溯中出现的错误,在删除它后,它可以正常工作。


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