如何使用子进程Popen运行命令

时间:2015-10-21 11:57:03

标签: python python-2.7

有没有办法恢复使用Popen执行的命令行?

command = Popen(['ls', '-l'])

如何从命令对象中获取ls -l?我正在使用python 2.7

3 个答案:

答案 0 :(得分:3)

如果你正在使用Python 3,command.args是最简单的方法:

from subprocess import Popen
command = Popen(['ls', '-l'])

print command.args

输出:

['ls', '-l']

请注意,输出是一个列表。

答案 1 :(得分:3)

对于python-2.7,参数不会像3.3版一样存储。你要做的就是记住它们或者做一个解决方法。

一种方法是编写自己的继承自Popen或只是在Popen周围编写一个包装器:

from subprocess import _Popen

def Popen(*args, **kwds):
    res = _Popen(*args, **kwds)

    if not hasattr(res, "args"):
        res.args = args[0]

    return res

当然,如果您愿意,可以存储所有位置和关键字参数。在3.3之前,args属性没有被使用,但之后它可能是你想要保护的,如上所示。

你甚至可以做一次检查(启动时)并使用一些猴子补丁。这是继承的一个例子:

from sys import version
import subprocess

class Popen(subprocess.Popen):
    def __init__(self, *args, **kwds):
        subprocess.Popen.__init__(self, *args, **kwds)
        self.args = args[0]

if version[0] < 3 or (version[0]==3 and version[1] < 3): # pre 3.3
    subprocess.Popen = Popen

答案 2 :(得分:0)

我有时会这样做!

import subprocess,
cmd = ["ls", "-a" ]
proc = subprocess.Popen(cmd, stdout = subprocess.PIPE)
stdout = proc.communicate()[0]