`zip` 在 shell 中有效,但在 Python 脚本中无效

`zip` 在 shell 中有效,但在 Python 脚本中无效

根据发布我正在使用 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)

相关内容