Search code examples
pythonpython-3.xloopsstdoutpopen

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


I have a basic script that reads a file which has package names to build a command string and I store in a variable. I then call a os.popen to run the command and store the output to a variable for further processing.

I loop over the variable looking for an 'Error:' string and if there is a match it prints it. All works good but it just prints the error which is what I want but I also want to know which package caused the error even if I include the package variable I only get the error.

Here are the contents of the file:

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

Here is the script:

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)

Here is the results of the script:

Error: No matching Packages to list

I was hoping to get the error + package name.

Can someone please tell me what I need to do to make the proper adjustments?


Solution

  • yum is writing the error message to stderr, not stdout. What you're seeing is the error message being printed by yum, not from your script.

    You need to redirect stderr to stdout so you can capture it and check it.

    It's also a good idea to remove the trailing newline from the line being read from the file, so do pkg = pkg.strip()

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