Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.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 如何对管道使用'subprocess'命令_Python_Linux_Subprocess_Pipe - Fatal编程技术网

Python 如何对管道使用'subprocess'命令

Python 如何对管道使用'subprocess'命令,python,linux,subprocess,pipe,Python,Linux,Subprocess,Pipe,我想使用子流程。使用ps-A | grep“process\u name”检查_output()。 我尝试了各种各样的解决方案,但到目前为止没有任何效果。有人能告诉我怎么做吗?要使用带有子流程的管道模块,您必须通过shell=True 然而,由于各种原因,尤其是安全性方面的原因,这并不是真正可取的。相反,分别创建ps和grep进程,并将输出从一个进程导入另一个进程,如下所示: ps = subprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE)

我想使用
子流程。使用
ps-A | grep“process\u name”检查_output()

我尝试了各种各样的解决方案,但到目前为止没有任何效果。有人能告诉我怎么做吗?

要使用带有
子流程的管道
模块,您必须通过
shell=True

然而,由于各种原因,尤其是安全性方面的原因,这并不是真正可取的。相反,分别创建
ps
grep
进程,并将输出从一个进程导入另一个进程,如下所示:

ps = subprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE)
output = subprocess.check_output(('grep', 'process_name'), stdin=ps.stdout)
ps.wait()

但是,在您的特定情况下,简单的解决方案是调用
子流程。检查输出(('ps','-A')
,然后在输出上
str.find

或者您可以始终在子流程对象上使用通信方法

cmd = "ps -A|grep 'process_name'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)

Communication方法返回标准输出和标准错误的元组。

您可以在以下位置尝试管道功能:


另外,尝试使用
'pgrep'
命令而不是
'ps-A | grep'进程_name'
请参阅有关使用子进程设置管道的文档:

我尚未测试以下代码示例,但它应该大致符合您的要求:

query = "process_name"
ps_process = Popen(["ps", "-A"], stdout=PIPE)
grep_process = Popen(["grep", query], stdin=ps_process.stdout, stdout=PIPE)
ps_process.stdout.close()  # Allow ps_process to receive a SIGPIPE if grep_process exits.
output = grep_process.communicate()[0]

JKALAVIS解决方案很好,但是我会添加一个改进,使用shlex而不是SHELL=TRUE。下面是我的查询时间

#!/bin/python
import subprocess
import shlex

cmd = "dig @8.8.4.4 +notcp www.google.com|grep 'Query'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)

在Python 3.5之后,您还可以使用:

导入子流程
f=打开('test.txt','w')
process=subprocess.run(['ls','-la'],stdout=subprocess.PIPE,universal_newlines=True)
f、 写入(process.stdout)
f、 关闭()
命令的执行被阻塞,输出将进入过程。stdout

使用

command = "ps -A | grep 'process_name'"
output = subprocess.check_output(["bash", "-c", command])
导入子流程
ps=subprocess.run(['ps','-A'],check=True,capture\u output=True)
processNames=subprocess.run(['grep','process\u name'],
输入=ps.stdout,捕获\输出=真)
打印(processNames.stdout)


+1用于分离输出/输入,以避免使用
shell=True
不要忘记,错误
子流程。调用的流程错误:命令“('grep','process_name')”返回非零退出状态1
只意味着grep找不到任何内容,因此这是正常行为。为什么我们需要
ps.wait()
当我们已经有了输出时
ps.wait.\uuuu doc\uuuu
等待子项终止,但子项的内容似乎已放入
输出中
variable@MakisH您正在查看的是
string.find
,它被弃用为
str.find
(即
str
对象上的
find
方法)注:如果
grep
过早死亡
ps
如果产生足够的输出来填充其OS管道缓冲区,则可能会无限期挂起(因为您尚未在父级中调用
ps.stdout.close()
)。如果您想要获取进程id,obviouslyrelated:有一个允许以可移植的方式获取进程信息的,查看下面Taymon的答案,了解一些不影响子流程的东西。检查输出在Python 2.6.9中似乎不存在。我认为使用
通信
等待
更好。这样的警告:“这将在使用stdout=PIPE和/或stderr=PIPE时死锁,并且子进程将生成足够的输出到管道,从而阻止等待OS管道缓冲区接受更多数据。请使用communicate()避免这种情况。”为了澄清Paolo上面的评论,警告是等待,不是为了通信-也就是说,这是他说通信更好的原因。python3中ps.communicate()[0]的输出返回一个bytes对象。为什么在shell上使用shellx?这里使用的是shlex?此代码使用的是
shell=True
;shlex已导入,但被忽略。这里没有任何改进。为什么不使用
shell=True
并让它在前面加上前缀
['sh','-c']
?此代码中的任何内容都不需要bash。(也就是说,完全避免使用shell是更好的做法;这个用例是合理的,但是一旦参数开始参数化——比如将进程名称作为参数——安全问题就会出现)。它很有用,因为您不必拆分字符串,当你引用空格的时候会变得很复杂,是吗<代码>子流程。检查输出(命令,shell=True)
不需要拆分字符串
Popen
将任何字符串转换为只包含该字符串的列表——因此,
[command]
——因此使用
shell=True
可以将
['sh','-c']
放在该列表的前面,因此最终得到
['sh','-c',command]
,除了
sh
/
bash
差异之外,您的代码在这里所做的一切都是正确的……就此而言,如果您尝试将字符串拆分为一个列表,并使用
shell=True
,那么只有该列表的第一个元素将被视为代码;您将得到类似于
['sh'、'-c'、'ps'、'-A'、'-A'、'grep'、'process\u name']
。这不是一件有用的事情:当以这种方式调用时,shell运行
ps
,其中
$0
-a
$1
|
,等等。。。但是由于命令
ps
没有查看
$0
$1
等,所有额外的内容都被忽略了。如果您阅读,您会发现
子进程之间没有任何区别。检查输出([“sh”,“-c”,command])
子进程。检查输出(command,shell=True)
。代码清晰而简单——这不是一个可以在细节中隐藏魔鬼的地方。注意:
capture\u output
只适用于Python 3.7.9及以上版本。check
做什么以及
capture\u output
的目的是什么?
command = "ps -A | grep 'process_name'"
output = subprocess.check_output(["bash", "-c", command])