从shell命令获取输出的最具python风格的方法

从shell命令获取输出的最具python风格的方法,python,subprocess,stdout,python-2.x,Python,Subprocess,Stdout,Python 2.x,我正在编写我的第一个python程序,我想运行一个shell命令并获得输出。我想用最干净的方式做这件事。这是我的自动取款机。 注意:我还想在shell命令执行出现问题时引发一个异常 def lsCommand(): process = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out , err = process.communicate() returnc

我正在编写我的第一个python程序,我想运行一个shell命令并获得输出。我想用最干净的方式做这件事。这是我的自动取款机。 注意:我还想在shell命令执行出现问题时引发一个异常

def lsCommand():
    process = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out , err = process.communicate()
    returnc = process.returncode
    if returnc != 0:
        raise Exception(err)
    else:
        return out

我发现,当我删除行时,err=process.communicate(),并将其替换为time.sleep(4)(它不会调用
time.sleep
,它将等待命令完成执行,可能需要4秒或更长时间

调用
process.communicate()
时,它将实际调用命令并在
process.returncode
中设置值

如果您不调用
process.communicate()
,则
process.returncode
的默认值为
None
,以及当您将
process.communicate()
替换为
time.sleep(4)
时它的返回值

子返回代码,由poll()和wait()设置(,并间接由communicate())设置。None值表示进程尚未终止


负值-N表示子级被信号N终止(仅限Unix)。

它不会调用
时间。sleep
,它将等待命令完成执行,可能需要4秒或更长时间

调用
process.communicate()
时,它将实际调用命令并在
process.returncode
中设置值

如果您不调用
process.communicate()
,则
process.returncode
的默认值为
None
,以及当您将
process.communicate()
替换为
time.sleep(4)
时它的返回值

子返回代码,由poll()和wait()设置(,并间接由communicate())设置。None值表示进程尚未终止


负值-N表示子进程被信号N终止(仅Unix)。

是,
通信
意味着
等待
;它读取进程'
标准输出
标准输出
,直到它们关闭

在第二个示例中,您使用
PIPE
读取
ls
;子进程
ls
被阻止写入
stdout
stderr
,直到您从管道中读取为止-因此,在读取这些描述符之前,它不会在4秒内,甚至4年内完成ally容易出错,
Popen
类有
communicate
方法来避免陷阱


要了解一种非常类似Python的方法来轻松获取命令的输出,请参见自Python 3.1和2.7以来提供的,尽管它不会在失败时引发包含
stderr
内容的异常。如果您需要异常以消息形式包含stderr的内容,则第一个示例很好


要在Python中调用完整管道,可以将完整管道作为命令使用
shell=True

pipeline = subprocess.Popen(
    'sudo find "/media/usb0" -type f -name "*.JPG" | wc -l',
    shell=True,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE
)
但是,您也可以使用
Popen
s来:


是,
communicate
表示
wait
;它读取进程“
stdout
stderr
,直到它们关闭

在第二个示例中,您使用
PIPE
读取
ls
;子进程
ls
被阻止写入
stdout
stderr
,直到您从管道中读取为止-因此,在读取这些描述符之前,它不会在4秒内,甚至4年内完成ally容易出错,
Popen
类有
communicate
方法来避免陷阱


要了解一种非常类似Python的方法来轻松获取命令的输出,请参见自Python 3.1和2.7以来提供的,尽管它不会在失败时引发包含
stderr
内容的异常。如果您需要异常以消息形式包含stderr的内容,则第一个示例很好


要在Python中调用完整管道,可以将完整管道作为命令使用
shell=True

pipeline = subprocess.Popen(
    'sudo find "/media/usb0" -type f -name "*.JPG" | wc -l',
    shell=True,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE
)
但是,您也可以使用
Popen
s来:


谢谢,非常有用。如果它解决了您的问题,请选择它作为答案。它部分解决了问题,但我仍然想知道这是否是在python 2.7上编写的从shell命令获得输出的最干净的代码。或者有什么更干净的方法吗?谢谢,非常有用。如果它解决了您的问题,请选择它作为答案。它部分解决了任务ion,但我仍然想知道这是否是在Python2.7上编写的从shell命令获取输出的最干净的代码。或者有什么更干净的方法吗?我正在使用Python2.7,应该这么说。对不起。我将编辑我的问题。我已经读过关于检查输出的内容,我尝试过使用它,但不起作用,我会再试一次。谢谢。你知道h吗在我的第一篇文章中,如何将它与较长的命令(如sudo find)一起使用?如果我不关心错误消息,这是否更具python风格?:def lsCommand():process=subprocess。检查输出(['ls','-l']))return process据我所知,您在文章末尾给出的find示例无法使用check_output方法完成,因为您使用的是stdout=subprocess.PIPE,根据文档,这可能会导致死锁。我说的对吗?啊,您
wc.communicate()
我正在使用python 2.7,应该这么说。对不起,我将编辑我的问题。我已经阅读了关于检查输出的内容,我尝试过使用它,但不起作用,我会再试一次。谢谢。你知道如何将它与我的第一篇文章中的sudo find…这样的较长命令一起使用吗?如果我不关心错误消息,这是否更像python?:def lsCommand():process=subprocess.check_output(['ls','-l'])返回进程据我所知,您在文章末尾给出的find示例无法使用check_outp完成
find = subprocess.Popen(
    ['sudo', 'find', '/media/usb0', '-type', 'f', '-name', '*.JPG'],
    stdout=subprocess.PIPE
)
wc = subprocess.Popen(
    ['wc', '-l'],
    stdin=find.stdout,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE
)
find.stdout.close()
wc.communicate()