“如何运行”;ps cax“grep something”;用Python?

“如何运行”;ps cax“grep something”;用Python?,python,command,pipe,Python,Command,Pipe,如何使用管道|运行命令 子流程模块似乎很复杂 有类似的吗 output,error = `ps cax | grep something` 与shell脚本一样?请参阅: import subprocess process = subprocess.Popen("ps cax | grep something", shell=True, stdout=subprocess.PI

如何使用管道
|
运行命令

子流程模块似乎很复杂

有类似的吗

output,error = `ps cax | grep something`
与shell脚本一样?

请参阅:

import subprocess

process = subprocess.Popen("ps cax | grep something",
                             shell=True,
                             stdout=subprocess.PIPE,
                           )
stdout_list = process.communicate()[0].split('\n')
注:使用
shell=True
可能会有危险。参见文档中的示例


还有一种方法可以使Python中的子流程脚本编写更加愉快:

import sh
print(sh.grep(sh.ps("cax"), 'something'))
如果要用某个变量替换grep参数:

os.system('ps -cax|grep '+your_var)

您已经接受了答案,但是:

你真的需要使用grep吗?我会这样写:

import subprocess
ps = subprocess.Popen(('ps', 'cax'), stdout=subprocess.PIPE)
output = ps.communicate()[0]
for line in output.split('\n'):
    if 'something' in line:
        ...

这样做的优点是不涉及
shell=True
及其风险,不会派生出单独的grep进程,并且看起来非常类似于您编写的处理数据文件(如对象)的Python。

放下“ps”子进程,慢慢后退!:)


改用模块。

不要对
子流程执行此操作。使用外壳更容易做到这一点。事实上,这是shell做得最好的一件事。grep something中的某个东西将是一个变量,我是否应该用变量构造“ps cax | grep something”字符串来运行它?或者还有其他的方法吗?或基本上,
'grep%s
%variable`.@Eugene:可以使用变量构造字符串,但要注意变量的来源。也就是说,确保它不是来自可以将“某物”转换为“某物;rm-rf/”
的用户。生成使用shell=True运行的表达式可能存在安全风险。@Kirk Strauser,您不能获取输出吗?我已经在交互式python解释器中对其进行了测试,并将其作为脚本运行,它可以按预期工作(我的python版本是2.7.1,如果有帮助的话)
os.system
只返回子进程的int-exit代码。如果您在交互式提示符下运行它并看到ps的输出,那是因为ps正在向stout写入。Python实际上并没有捕获该输出。自己试试看:运行
a=os.system('ls')
。您仍将看到ls的输出,
a
将为0(假设ls没有因为某种原因失败)。这是不安全的。如果
您的_var
是由其他人设置的,则此代码允许他们运行所需的任何命令。例如
your_var=“a;echo you got hacked”
我强烈推荐您使用sh模块。
sh.grep(sh.ps('aux','u piped=True),'something')
-适用于me@unutbu,您能更详细地解释一下为什么
proc1.stdout.close()
应该被调用吗?@SangminKim:这似乎在Python3中已经修复或解决了,但至少在Python2.7中,如果要在
proc1
中生成一个长时间运行的进程,例如
find/-print
,而不调用
proc1.stdout.close()
并在
proc2
中生成一个短时间运行的命令,如
head
,然后您会看到
find/-print
在对
head
的调用结束后很长时间仍在运行。包含
proc1.stdout.close()
允许
find
head
完成后立即结束。有关SIGPIPE的更多信息,请参阅和。我想使用psutil,但如果不说明如何操作,这个答案就没有多大帮助。请共享示例
导入psutil;对于psutil.process_iter()中的进程:cmdline=“.join(proc.cmdline());如果cmdline:break
中的某些内容对我来说,
output
是一个[byte],必须像
str(output.split(\\n”)
os.system('ps -cax|grep '+your_var)
import subprocess
ps = subprocess.Popen(('ps', 'cax'), stdout=subprocess.PIPE)
output = ps.communicate()[0]
for line in output.split('\n'):
    if 'something' in line:
        ...