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



所以我开始学习Python,我正在编写一个脚本:

  1. 使用urlib.urlretrieve下载RPM
  2. 使用rpm2cpio和cpio提取文件
  3. 对文件做点什么
  4. 使用shutil.rmtree进行清理

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

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"one_answers"cpio"命令让一些东西保持打开状态,只要脚本像我需要显式关闭的东西一样运行。。。?这有意义吗?:)

谢谢!J

subprocess.Popen是非阻塞的,所以基本上有一个竞争条件——在对Popenrmtree的调用之间,不能保证这些进程能够在rmtree运行之前完成(甚至启动!)。

我建议您等待Popen对象返回

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

使用阻塞subprocess.call看起来不像是您管道命令的一个选项。

相关内容

  • 没有找到相关文章

最新更新