Python 如何集成文件的输出和数据?
我有一个基本脚本,它读取一个文件,该文件包含用于构建命令字符串的包名,并存储在一个变量中。 然后我调用一个Python 如何集成文件的输出和数据?,python,python-3.x,loops,stdout,popen,Python,Python 3.x,Loops,Stdout,Popen,我有一个基本脚本,它读取一个文件,该文件包含用于构建命令字符串的包名,并存储在一个变量中。 然后我调用一个os.popen来运行该命令,并将输出存储到一个变量以供进一步处理 我在变量上循环查找“Error:”字符串,如果存在匹配项,它将打印它。所有的工作都很好,但它只是打印错误,这是我想要的,但我也想知道是哪个包导致了错误,即使我包含了包变量,我也只得到了错误 以下是该文件的内容: kernel-3.10.0-1160.el7 openshift-clients-4.3.7-2020031305
os.popen
来运行该命令,并将输出存储到一个变量以供进一步处理
我在变量上循环查找“Error:”字符串,如果存在匹配项,它将打印它。所有的工作都很好,但它只是打印错误,这是我想要的,但我也想知道是哪个包导致了错误,即使我包含了包变量,我也只得到了错误
以下是该文件的内容:
kernel-3.10.0-1160.el7
openshift-clients-4.3.7-202003130552.git.0.6027a27.el7
NetworkManager-config-server-1.18.8-1.el7
python2-psutil-5.6.6-1.el7ar
systemd-219-67.el7_7.1.x86_64
以下是脚本:
import os
import sys
f=open("data1", "r")
for pkg in f:
#print(pkg)
command='yum --showduplicates list + ' +pkg
with os.popen(command) as results_in:
for item in results_in:
if 'Error:' in item:
print(item + "package name:" + pkg)
Error: No matching Packages to list
以下是脚本的结果:
import os
import sys
f=open("data1", "r")
for pkg in f:
#print(pkg)
command='yum --showduplicates list + ' +pkg
with os.popen(command) as results_in:
for item in results_in:
if 'Error:' in item:
print(item + "package name:" + pkg)
Error: No matching Packages to list
我希望得到错误+包名
有人能告诉我需要做什么来进行适当的调整吗?
yum
正在将错误消息写入stderr
,而不是stdout
。您看到的是由yum
打印的错误消息,而不是来自您的脚本
您需要将stderr
重定向到stdout
,以便捕获并检查它
从文件中读取的行中删除尾随的换行符也是一个好主意,也可以这样做pkg=pkg.strip()
我用另一种方式编写脚本来获取我正在寻找的数据。谢谢你的帮助!你激发了stderr的想法,所以我追踪这个方法来捕获它并基于它做出响应
import subprocess
import shlex
f=open("data1", "r")
for pkg in f:
command='yum list available ' + pkg
proc = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = proc.stdout.readline()
stdout, stderr= proc.communicate()
if 'Error' in str(stderr, 'utf-8').strip():
print("Error not available: "+pkg)
else:
print("Package available: "+pkg)
在我看来,它应该在错误消息之后立即打印包名,正如您所希望的那样。尝试将其更改为
+pkg.strip()
,以删除CRLFI,但它仍然只生成相同的消息,这只是错误,而不是错误和包。我确实创建了相同的脚本,但我使用了另一个命令ping,我能够从ping输出和文件的IP中提取消息。感谢您的回复!我用与您建议的相同的语法尝试了这一点,结果是:第7行命令=f'yum--showduplicates-list{pkg}2>&1'。我更新了该命令,使其看起来像这个命令='yum--showduplicates list'+pkg+'2>&1',并得到了预期的错误,但没有得到包名。您需要Python 3.6才能使用f-strings。我在3.6上尝试了它,得到了相同的结果。下面是var I added command=f'yum--showdeplicates list'+pkg+'2>&1',它只是修复了f-string语法错误,与问题的其余部分无关。如果您使用的是f-string,为什么还要使用串联?