Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.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 如何集成文件的输出和数据?_Python_Python 3.x_Loops_Stdout_Popen - Fatal编程技术网

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,为什么还要使用串联?