繁体   English   中英

如何将 bash 命令的输出放置到 Python 变量中?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM