使用来自 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 行和子进程的主要内容,如果未能解决你的问题,请参考以下文章
使用来自 Textfile 的文件创建 7-Zip 存档 - Powershell