使用来自 Python 的 7-zip cmd 行和子进程

Posted

技术标签:

【中文标题】使用来自 Python 的 7-zip cmd 行和子进程【英文标题】:Using 7-zip cmd line from Python with subprocess 【发布时间】:2018-07-18 02:41:39 【问题描述】:

我正在尝试使用子进程库通过 Python 脚本中的命令行代码运行 7zip。

当我直接在命令行中使用下面的代码时,它可以正常工作。但是,我无法让它与子进程一起运行。

set path="C:\Program Files\7-Zip\";%path%
7z x C:\\Users\\ferro\\Desktop\\teste.zip -pabc123 -oC:\\Users\\ferro\\Desktop -aos -y

我正在尝试执行的当前代码如下。

    import subprocess
    import os

    os.system('set path="C:\Program Files\7-Zip\";%path%')
    command01 = ['7z', 'x', 'C:\\Users\\ferro\\Desktop\\teste.zip', '-p', 'abc123', '-o', 'C:\\Users\\ferro\\Desktop', '-aos', '-y']

    subprocess.call(command01)

错误信息是“FileNotFoundError: [WinError 2]

有谁知道我的错误在哪里?

【问题讨论】:

你必须小心字符串中的反斜杠。在某些情况下,这可以指示控制字符。请您尝试执行以下操作吗?:os.system(r'set path="C:\Program Files\7-Zip\";%path%') 嗨,伯尼。谢谢你的解释。我尝试了您的建议,但不幸的是我得到了相同的结果。 【参考方案1】:

您的环境设置(包括 PATH 变量)不会传递给子进程。您可以像这样复制、编辑和传递它们:

myenv = os.environ.copy()
myenv['PATH'] = '<path>;' + myenv['PATH']
subprocess.call(..., env=myenv)

但是你为什么不直接使用它的完整路径调用 7-zip 而不是摆弄 PATH 变量呢?

command01 = [r'C:\Program Files\7-Zip\7z.exe', ...]
subprocess.call(command01)

顺便说一句,您还可以将完整的命令提供为单个字符串(在 Windows 上,转换为字符串是 done anyway 在引擎盖下):

command02 = r'C:\Program Files\7-Zip\7z.exe ...'
subprocess.call(command02)

【讨论】:

subprocess 是否需要指定可执行扩展名? 'C:\\Program Files\\7-Zip\\7z.exe' @lit 不,它不需要扩展。但它也没有什么害处,可能会让事情变得更清楚一些,所以我会添加它。 谢谢你,阿曼。我直接在代码中使用了完整的 PATH,我还修复了 subprocess 命令中的一些语法错误,它现在可以工作了。作为记录,我犯的错误是将-p 从密码中拆分出来,将-o 从输出目录中拆分出来。最终代码为command01 = ['C:\\Program Files\\7-Zip\\7z', 'x', 'C:\\Users\\ferro\\Desktop\\teste.zip', '-pabc123', '-oC:\\Users\\ferro\\Desktop\\', '-aoa', '-y']

以上是关于使用来自 Python 的 7-zip cmd 行和子进程的主要内容,如果未能解决你的问题,请参考以下文章

Linux中,7z的命令行示例太少了

使用来自 Textfile 的文件创建 7-Zip 存档 - Powershell

7-zip认识

7Z命令行详解

7-Zip 遭抵制?呼吁者定下“三宗罪”:伪开源不安全作者来自俄罗斯!

在 CMD 上调用部分 Python 代码的快捷方式