Python - 为什么我会看到这个输出?
Python - Why Am I Seeing This Output?
所以我开始 Python 并且我正在编写一个脚本来:
- 使用 urllib.urlretrieve 下载 RPM。
- 使用 rpm2cpio 和 cpio 提取文件。
- 用文件做一些事情。
- 使用 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' 和 'cpio' 命令让某些东西保持打开状态,只要脚本 运行 就像我需要明确关闭的东西一样...?这有任何意义吗? :)
谢谢!
J
subprocess.Popen
is non-blocking,所以你基本上有一个竞争条件 - 在你调用 Popen
和 rmtree
之间,不能保证这些进程可以在之前完成(甚至开始!) rmtree
运行。
我建议您等待 Popen 对象 return 和
cpio.wait()
rpm2cpio.wait()
# Remove the temp directory and all it's contents
shutil.rmtree("/tempdir")
使用阻塞 subprocess.call
看起来不适合您如何通过管道传输命令。
所以我开始 Python 并且我正在编写一个脚本来:
- 使用 urllib.urlretrieve 下载 RPM。
- 使用 rpm2cpio 和 cpio 提取文件。
- 用文件做一些事情。
- 使用 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' 和 'cpio' 命令让某些东西保持打开状态,只要脚本 运行 就像我需要明确关闭的东西一样...?这有任何意义吗? :)
谢谢! J
subprocess.Popen
is non-blocking,所以你基本上有一个竞争条件 - 在你调用 Popen
和 rmtree
之间,不能保证这些进程可以在之前完成(甚至开始!) rmtree
运行。
我建议您等待 Popen 对象 return 和
cpio.wait()
rpm2cpio.wait()
# Remove the temp directory and all it's contents
shutil.rmtree("/tempdir")
使用阻塞 subprocess.call
看起来不适合您如何通过管道传输命令。