[英]How do I place output of bash command to Python variable?
如何将 bash 命令的输出放置到 Python 变量中?
我正在编写一个 Python 脚本,我想输入 bash 命令的输出: rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH} %{VENDOR}\\n' | grep -v 'Red Hat'|wc -l
rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH} %{VENDOR}\\n' | grep -v 'Red Hat'|wc -l
,并将其放置到 Python 变量中,比如说R
。
之后我想做,Python if R != 0
然后运行一些 Linux 命令。 我如何做到这一点?
有多种选择,但最简单的可能是使用subprocess.check_output()
和shell=True
虽然如果您不完全控制传入的命令,这可能会带来安全隐患。
import subprocess
var = subprocess.check_output('rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH} %{VENDOR}\n' | grep -v 'Red Hat'|wc -l', shell = True)
var = int(var)
您需要使用shell=True
否则管道将不会被解释。
如果您需要更多控制,您可能需要查看您可以执行的plumbum
:
from plumbum.cmd import rpm, grep, wc
chain = rpm["-qa", "--qf", r"%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH} %{VENDOR}\n"] | grep["-v", "Red Hat"] | wc["-l"]
R = int(chain())
虽然我可能不会调用wc
并获取整个输出并计算它在 python 中的长度(更容易检查你是否只得到了你期望的行,通过wc -l
管道会丢弃所有细节)
我推荐envoy
主要是因为该 API 在 90% 的用例中使用起来更加直观。
r = envoy.run('ls ', data='data to pipe in', timeout=2)
print r.status_code # returns status code
print r.std_out # returns the output.
有关更多详细信息,请参阅Envoy Github页面。
您可以使用标准输入。
#!/usr/bin/python
import sys
s = sys.stdin.read()
print s
然后你会像这样运行一个 bash 命令
echo "Hello" | ./myscript.py
输出
Hello
您可以使用 Popen 替换 shell 管道:
from subprocess import PIPE,Popen
p1 = Popen(["rpm", "-qa", "--qf", '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH} %{VENDOR}\n'],stdout=PIPE)
p2 = Popen(["grep", "-v", 'Red Hat'],stdin=p1.stdout,stdout=PIPE)
p1.stdout.close()
p3 = Popen(["wc", "-l"],stdin=p2.stdout,stdout=PIPE)
p2.stdout.close()
out,err = p3.communicate()
如果您只想检查 grep 是否返回了任何匹配项,那么忘记 wc - l 并检查 grep 返回的内容:
p1 = Popen(["rpm", "-qa", "--qf", '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH} %{VENDOR}\n'],stdout=PIPE)
p2 = Popen(["grep", "-v", 'Red Hat'],stdin=p1.stdout,stdout=PIPE)
p1.stdout.close()
out,err = p2.communicate()
if out:
...
或者只是使用check_output
来运行rpm
命令并检查"Red Hat"
的字符串:
out = check_output(["rpm", "-qa", "--qf", '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH} %{VENDOR}\n'])
if "Red Hat" not in out:
....
这与使用grep -v
反转搜索然后检查是否与 wc 匹配相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.