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

时间:2017-11-01 14:45:41

标签: python decorator shutil contextmanager cpio

所以我进入Python并且我正在写一个脚本:

  1. 使用urllib.urlretrieve下载RPM。
  2. 使用rpm2cpio和cpio。
  3. 提取文件
  4. 用文件做一些事情。
  5. 使用shutil.rmtree进行清理。
  6. 从功能上来说,所有这一切都很好,但是因为我输入了清理代码,所以我得到了以下输出:

    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'命令只要脚本运行就像我需要显式关闭的那样......这有任何意义吗? :)

    谢谢! Ĵ

1 个答案:

答案 0 :(得分:0)

subprocess.Popen is non-blocking,所以你基本上有竞争条件 - 在你对Popenrmtree的调用之间,无法保证这些进程可以在{{{{}}之前完成(甚至开始!) 1}}跑。

我建议你等待Popen对象返回

rmtree

使用阻止subprocess.call对于您如何管理命令看起来不是一个选项。