gpt4 book ai didi

python - os.system(cmd) 和 subprocess.call(cmd, shell=True) 的执行与 CMD.EXE 不同

转载 作者:可可西里 更新时间:2023-11-01 10:02:46 26 4
gpt4 key购买 nike

我正在尝试将一个长而复杂的 Windows 批处理文件转换为 Python。

除了细微的问题外一切正常,我怀疑这与引用有关,但不太清楚。

在批处理文件中,这工作正常:

Reg.exe add "HKCR\7-Zip.zip\shell\open\command" /ve /t REG_SZ /d "\"C:\Program Files\7-Zip\7zFM.exe\" \"%%1\"" /f

这段 Python 代码旨在但没有做同样的事情:

import os, subprocess

cmd = r'Reg.exe add "HKCR\7-Zip.zip\shell\open\command" /ve /t REG_SZ /d "\"C:\Program Files\7-Zip\7zFM.exe\" \"%%1\"" /f'
#os.system(cmd)
subprocess.call(cmd, shell=True)

请注意,(原始)字符串 cmd 和批处理文件完全相同。

os.system() 和 subprocess.call() 的结果相同 - 没有错误(Reg.exe 表示一切正常),但对系统的影响不同。

在我的测试中,批处理文件将归档器 7z 配置为打开 .ZIP 文件本身(正确结果)。

Python 代码导致 7z 打开 .ZIP 所在的文件夹(错误)。

如何让 Python 执行批处理文件的操作?

最佳答案

好的,在黑暗中拍摄:

我会放弃 shell=True 并使用参数列表传递给 subprocess。报价将自动处理:

cmd = ['Reg.exe','add',r'HKCR\7-Zip.zip\shell\open\command','/ve','/t','REG_SZ','/d',r'"C:\Program Files\7-Zip\7zFM.exe" "%1"','/f']
rc = subprocess.call(cmd)

还要检查 subprocess.call 的返回码

如果你想“自动”处理多个这样的命令,我建议使用 shlex.split ,我并不是说它会解决所有问题,但它在引号方面做得很好(保护引用的参数,引用嵌套):

import shlex
text = r"""Reg.exe add "HKCR\7-Zip.zip\shell\open\command" /ve /t REG_SZ /d "\"C:\Program Files\7-Zip\7zFM.exe\" \"%%1\"" /f"""

print([x.replace("%%","%") for x in shlex.split(text)]) # %% => % in listcomp, add more filters if needed

结果:

['Reg.exe', 'add', 'HKCR\\7-Zip.zip\\shell\\open\\command', '/ve', '/t', 'REG_SZ', '/d', '"C:\\Program Files\\7-Zip\\7zFM.exe" "%1"', '/f']

与原始前缀相同的是:

['Reg.exe', 'add', r'HKCR\7-Zip.zip\shell\open\command', '/ve', '/t', 'REG_SZ', '/d', r'"C:\Program Files\7-Zip\7zFM.exe" "%1"', '/f']

很接近吧? :)

关于python - os.system(cmd) 和 subprocess.call(cmd, shell=True) 的执行与 CMD.EXE 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49601829/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com