【问题标题】:subprocess unzip with source file remove?子进程解压缩源文件删除?
【发布时间】:2023-08-02 03:09:01
【问题描述】:

我正在使用 python 子进程解压缩一个 zip 存档。我的代码如下:

subprocess.Popen(['unzip', '{}.zip'.format(inputFile), '-d', output_directory])

解压后是否有一个解压缩命令来删除 zip 源文件?如果不是,我如何通过管道将rm 传递给subprocess.Popen,但要确保它首先等待文件解压缩?

谢谢。

【问题讨论】:

  • 为什么不使用zipfile 库? *.com/questions/3451111/unzipping-files-in-python 这是有关如何删除文件的链接答案。 *.com/questions/6996603/…
  • 此外,如果您的 python 版本允许,最好使用subprocess.run 而不是subprocess.Popen。见*.com/a/39187984/6555423python docs
  • 好吧,我将使用 os.remove 我只是想确保它仅在文件被提取后才会删除文件,这就是为什么我想将它打开到子进程
  • 好的。 subprocess 用于启动可以与 Python 脚本并行运行的新进程。如果您想等待启动的进程完成(例如,您可以删除它使用的文件),您可以在 Python 2.7 中使用subprocess.call()。但是请注意,如果您的脚本除了等待之外别无他法,则没有任何理由使用subprocess,因为您可以使用zipfile 模块解压缩文件。
  • 或者您也可以使用subprocess.call 等待命令完成。

标签: python python-2.7 subprocess unzip


【解决方案1】:

您可以在 Shell 中使用&&,只有在第一个命令成功时才会执行第二个命令:

import subprocess
import os

values = {'zipFile': '/tmp/simple-grid.zip', 'outDir': '/tmp/foo'}
command = 'unzip {zipFile} -d {outDir} && rm {zipFile}'.format(**values)
proc = subprocess.Popen(command, shell=True)
_ = proc.communicate()

print('Success' if proc.returncode == 0 else 'Error')

或者,os.remove() 如果unzip 成功:

inputFile = values['zipFile']
output_directory = values['outDir']

proc = subprocess.Popen(
    ['unzip', '{}'.format(inputFile), '-d', output_directory]
)
_ = proc.communicate()  # communicate blocks!

if proc.returncode == 0:
    os.remove(values['zipFile'])
print('Success' if not os.path.exists(inputFile) else 'Error')

【讨论】:

  • 我会检查并回复您,谢谢。
  • 为什么第一个建议中有 shell=True 而第二个没有?我试图避免 shell=True。
  • 我不确定在没有shell 的情况下&& 是否能正常工作。
  • 没有 shell=True 的第二种解决方案效果很好,谢谢。