os.popen: 如何整合文件的输出和数据?

os.popen: How to integrate output and data from file?

我有一个基本脚本,它读取一个包含包名称的文件来构建一个命令字符串,并将其存储在一个变量中。 然后我调用 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

我希望得到错误+包名。

有人可以告诉我需要做什么才能进行适当的调整吗?

yum 正在将错误消息写入 stderr,而不是 stdout。您看到的是 yum 打印的错误消息,而不是您的脚本。

您需要将 stderr 重定向到 stdout 以便捕获并检查它。

从文件中读取的行中删除尾随换行符也是一个好主意,pkg = pkg.strip()

command=f'yum --showduplicates list ' + pkg + ' 2>&1'

我用另一种方式编写了脚本来获取我正在寻找的数据。谢谢您的帮助!你激发了 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)