我正在尝试使用 Python 的包子进程来压缩和 gzip 文件。我正在使用以下命令:
subprocess.call(['gunzip', a_path+myfile_gz], shell=True)
然后我收到错误消息:
gzip:不从终端读取的压缩数据。使用-f强制解压。
所以我输入:
subprocess.call(['gunzip', '-f', a_path+myfile_gz], shell=True)
我收到完全相同的错误消息。如果我输入shell=False
,情况会更糟。
这真的很奇怪,因为如果我从终端执行此操作,它就可以正常工作!有人知道出了什么问题吗?
答案1
问题是你正在通过shell=True
,所以你正在执行
sh -c gunzip /path/to/file.gz
(假设a_path+myfile_gz
是"/path/to/file.gz"
)。换句话说,因为shell
参数是True
,所以命令列表的第一个元素是 shell 片段;其他参数是该 shell 片段的参数(这里只是$0
)。这在文档。
如果你省略了shell=True
,你会得到工作,但不是好的代码。不要将路径作为字符串进行操作;使用中的函数os.path
。也许a_path+myfile_gz
应该是os.path.join(a_path, myfile_gz)
这样。
无论如何,Python 都内置支持压缩包。不要使用外部命令。