根据这发布我正在使用 Pythonzip
调用该命令os.system()
。
在命令行上它起作用:
zip -r /Backups/backups/20152011-120209{.zip,}
当我从 Python 脚本调用它时(PATH
是“/Backups/backups/20152011-120209”)
os.system("zip -r " + PATH + "{.zip,}")
它抛出:
zip error: Nothing to do! (/Backups/backups/20152011-122909{.zip,})
我究竟做错了什么?
我想将一个目录(包括其内容)压缩到同一位置的同名 zip 文件中(一个脚本将我的 MySQL 数据库转储到 *.sql 文件,然后我想压缩这些文件)。
答案1
在讨论这个问题之前,我将引用 Jacob Vlijm 在这个答案下的评论(感谢您的评论和链接):
[...] 使用 os.system 是个非常糟糕的主意。过时且弃用。改用 subprocess.call() 或 subprocess.Popen()。
这里这是第一个(或第一个)弃用提案,可以追溯到2010。
因此您确实应该使用subprocess.Popen()
而不是os.system()
。
当你运行时,os.system()
命令在 Dash ( /bin/sh
) 中执行,而当你在终端中运行命令时,命令在 Bash ( /bin/bash
) 中执行;
Dash 不支持括号扩展,而是{.zip,}
按字面意思解释;
在 Bash 中运行命令:更改
os.system("zip -r " + PATH + "{.zip}")
到
os.system("bash -c 'zip -r " + PATH + "{.zip,}'")
或者无论如何,正如 Darael 建议的,FWIW 传递/Backups/backups/20152011-120209{.zip,}
扩展/Backups/backups/20152011-120209
到/Backups/backups/20152011-120209.zip
,/Backups/backups/20152011-120209
你也可以直接传递路径,避免生成另一个 shell:
os.system("zip -r " + PATH + ".zip " + PATH)