Python - 为什么我会看到这个输出?

Python - Why Am I Seeing This Output?

所以我开始 Python 并且我正在编写一个脚本来:

  1. 使用 urllib.urlretrieve 下载 RPM。
  2. 使用 rpm2cpio 和 cpio 提取文件。
  3. 用文件做一些事情。
  4. 使用 shutil.rmtree.
  5. 清理

从功能上讲,这一切都很好,但由于我输入了清理代码,我得到了以下输出:

rpm2cpio: MyRPM.rpm: No such file or directory
cpio: premature end of archive

代码如下:

#!/usr/bin/python

from contextlib import contextmanager
import os, subprocess, shutil

@contextmanager
def cd(directory):
    startingDirectory = os.getcwd()
    os.chdir(os.path.expanduser(directory))
    try:
        yield
    finally:
        os.chdir(startingDirectory)

# Extract the files from the RPM to the temp directory
with cd("/tempdir"):
    rpm2cpio = subprocess.Popen(["rpm2cpio", "MyRPM.rpm"], stdout=subprocess.PIPE)
    cpio = subprocess.Popen(["cpio", "-idm", "--quiet"], stdin=rpm2cpio.stdout, stdout=None)

# Do
# Some
# Things
# Involving
# Shenanigans

# Remove the temp directory and all it's contents
shutil.rmtree("/tempdir")

如果您发现此处代码存在语法问题(或缺少导入或其他内容),请忽略,除非它确实与我收到这两条消息的原因有关。我试图将脚本剥离到相关位。我正在寻找的是关于为什么要打印上述两条消息的解释。 我假设脚本是自上而下执行的,但现在我想我在这种情况下可能是错误的?

编辑:感觉 'rpm2cpio' 和 'cpio' 命令让某些东西保持打开状态,只要脚本 运行 就像我需要明确关闭的东西一样...?这有任何意义吗? :)

谢谢! J

subprocess.Popen is non-blocking,所以你基本上有一个竞争条件 - 在你调用 Popenrmtree 之间,不能保证这些进程可以在之前完成(甚至开始!) rmtree 运行。

我建议您等待 Popen 对象 return 和

cpio.wait()
rpm2cpio.wait()

# Remove the temp directory and all it's contents
shutil.rmtree("/tempdir")

使用阻塞 subprocess.call 看起来不适合您如何通过管道传输命令。