如何使用subprocess Popen运行命令

3
有没有一种方法可以通过Popen执行命令行并返回结果?
command = Popen(['ls', '-l'])

我怎样从命令对象中获得ls -l?我使用的是Python 2.7。

3个回答

3

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

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

print command.args

输出:

['ls', '-l']

注意输出结果是一个列表。

哦!我得到了以下错误:AttributeError: 'Popen'对象没有'args'属性,你使用的是哪个版本的Python? - Har
@Har 抱歉,我使用的是Python 3.5版本。对此表示歉意,我会编辑我的回答 ;) - Remi Guan
1
@Har,好的,我现在就走。看起来Skyking已经发布了正确的答案。 - Remi Guan
1
谢谢,你的回答仍然很有用,因为我通常不使用Python 3,知道这已经存在于未来版本的Python中是很有帮助的。 - Har
@Har,我刚刚加了这个提示。很高兴你找到了正确的答案 :) - Remi Guan

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

0

我有时候就是这样做的!

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

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