为什么python subprocess zip失败但在shell上运行?

时间:2013-10-25 08:50:53

标签: python shell zip

我使用Python 2.7在Mac OS X上;使用subprocess.callzip失败但尚未在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%)

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

3 个答案:

答案 0 :(得分:10)

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

自己用os.listdir()glob模块扩展文件列表,或者从Python运行shell命令;使用shell=True的{​​{1}}参数(但使第一个参数为空格分隔的字符串)。

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

subprocess.call()

答案 1 :(得分:2)

Martijn建议使用glob.glob对于通用shell通配符很有用,但在这种情况下,它看起来好像要将目录中的所有文件添加到ZIP存档中。如果这是正确的,您可以使用-r选项zip

directory = 'example'
subprocess.call(['zip', '-r', 'example.zip', directory])

答案 2 :(得分:0)

尝试shell = True。 subprocess.call('zip example.zip example / *',shell = True)可行。