Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何获得多个系统命令的最终输出?_Python_Subprocess - Fatal编程技术网

Python:如何获得多个系统命令的最终输出?

Python:如何获得多个系统命令的最终输出?,python,subprocess,Python,Subprocess,这里有很多帖子,比如: 复杂的命令有问题。例如,如果我需要从这个 ps-ef | grep something | wc-l 子流程不会执行此任务,因为子流程的参数是[程序名,参数],因此不可能使用更复杂的命令(更多程序、管道等) 有没有办法捕获多个命令链的输出?好吧,另一种选择是用普通Python实现部分命令。比如说, count = 0 for line in subprocess.check_output(['ps', '-ef']).split('\n'): if somethi

这里有很多帖子,比如:

复杂的命令有问题。例如,如果我需要从这个

ps-ef | grep something | wc-l

子流程不会执行此任务,因为子流程的参数是[程序名,参数],因此不可能使用更复杂的命令(更多程序、管道等)


有没有办法捕获多个命令链的输出?

好吧,另一种选择是用普通Python实现部分命令。比如说,

count = 0
for line in subprocess.check_output(['ps', '-ef']).split('\n'):
    if something in line: # or re.search(something, line) to use regex
        count += 1
print count

只需将
shell=True
选项传递给子流程

import subprocess
subprocess.check_output('ps -ef | grep something | wc -l', shell=True)

对于使用子流程模块的无外壳、干净版本,可以使用以下示例():

变成

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]
Python程序在这里基本上完成了shell所做的工作:它将每个命令的输出依次发送到下一个命令。这种方法的一个优点是程序员可以完全控制命令的各个标准错误输出(如果需要,可以抑制、记录等)


这就是说,我通常更喜欢使用
子流程。check_output('ps-ef | grep something | wc-l',shell=True)
NNEO建议的shell委托方法:它是通用的、非常易读的和方便的。

我可以建议
count=sum(子流程中的行中的某个东西。check(…)
?这更直接。虽然我喜欢生成器,但我通常也不喜欢在代码中有很长的行。这只是一种风格上的东西;你的方法也一样好,ps命令就是一个例子。当然,我可以在python中模拟普通的grep功能和wc功能,但是还有其他命令组合。保存输出,然后“手动”执行管道(基于上一个输出的新子流程调用是可能的,但它并不优雅)虽然我理解长线可能是一件痛苦的事情,但我认为这里的结构足够简单,不会造成真正的混乱。这就是说,我发现两种方法之间的选择超出了风格:对于循环,必须阅读整个代码才能理解它的功能(基本上是对匹配行的递增计数),而对于
count=sum(…)
,可以立即看到
count
设置为匹配行的数量。这就是为什么列表理解通常比
result=[]更清晰;for(…):result.append()
循环。实际上,您可能会将
子流程存储在一个变量中。check(…)
并为
某物使用一个较短的名称,因此生成器表达式将变得更清晰,或者只是
子流程。check_输出('ps-ef | grep something | wc-l',shell=True)
@nneonneo,哦,是的,那更好:)@nneonneo谢谢你结束了一个小时的迷失和子流程文档和教程的帮助。
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]