6

我在使用 Python 2.7 的 Mac OS X 上;使用subprocess.callwithzip失败,但在 shell上运行相同的命令成功。这是我的终端的副本:

$ python
Python 2.7.2 (default, Oct 11 2012, 20:14:37) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> subprocess.call(['zip', 'example.zip', 'example/*'])
    zip warning: name not matched: example/*

zip error: Nothing to do! (example.zip)
12
>>> quit()
$ zip example.zip example/*
  adding: example/file.gz (deflated 0%)

我也尝试过使用完整路径并得到相同的结果。

4

3 回答 3

13

因为在 shell 中运行命令与使用subprocess.call();运行命令不同。shell 扩展了example/*通配符。

要么自己扩展文件列表os.listdir()glob模块,要么从 Python 通过 shell 运行命令;与shell=True参数为subprocess.call()(但使第一个参数为空格分隔的字符串)。

使用glob.glob()可能是这里最好的选择:

import glob
import subprocess

subprocess.call(['zip', 'example.zip'] + glob.glob('example/*'))
于 2013-10-25T08:53:30.673 回答
2

Martijn 的使用建议glob.glob适用于一般的 shell 通配符,但在这种情况下,您似乎想将目录中的所有文件添加到 ZIP 存档中。如果这是正确的,您也许可以使用以下-r选项zip

directory = 'example'
subprocess.call(['zip', '-r', 'example.zip', directory])
于 2013-10-25T11:31:02.793 回答
0

试试壳=真。subprocess.call('zip example.zip example/*', shell=True) 会起作用。

于 2013-10-25T08:59:00.217 回答