gpt4 book ai didi

python - 在 Windows 上,如何使用 Python 2.7 子进程保护 shell 脚本的参数?

转载 作者:可可西里 更新时间:2023-11-01 09:35:39 25 4
gpt4 key购买 nike

例如考虑以下 Python 代码:

subprocess.call([r'.\tst.bat', '"1|2"'])

为了保护“|”,我在 tst.bat 的参数周围加上了双引号从 shell 因为 tst.bat 最终将通过 Windows shell 运行。但是,如果参数中有双引号,Python 2.7 中的 subprocess 会将它们转义。结果是 tst.bat 收到这个参数:\"1|2\"。

我如何转义参数“1|2”,使其不经转换就传递给 tst.bat?

最佳答案

在为 call 方法提供参数列表的情况下,Windows 上的子进程模块 transforms使用 list2cmdline 将该列表转换为字符串功能。在此函数的文档字符串中,您可以阅读:

3) A double quotation mark preceded by a backslash is interpreted as a literal double quotation mark.

根据这个,你的问题的解决方案应该是这样的

subprocess.call([r'.\tst.bat', r'\"1|2\"'])

但是,list2cmdline 函数的文档和实现之间似乎存在不匹配;

Python 2.7.4 (default, Apr  6 2013, 19:55:15) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> print subprocess.list2cmdline([r'\"1|2\"'])
\\\"1|2\\\"

Python 3.3.1 中的行为相同。我在 http://bugs.python.org/issue18649 提出了一个错误

更新

事实证明,我对 list2cmdline 函数的极具误导性的文档字符串感到困惑 - 请参阅 http://bugs.python.org/issue18649了解详情。

传递给 subprocess.call 的参数序列由 list2cmdline 函数翻译,该函数仅与 MS C 运行时使用的引用机制有关,而不与使用的引用机制有关通过 cmd.exe。这使得将参数(稍后将由 cmd.exe 解释)作为列表传递给 subprocess.call 非常尴尬或不可能。

不过,在这种情况下还有一次机会让它发挥作用。 list2cmdline 将每个参数用双引号括起来,里面有空格或制表符。如果在参数末尾有一个空格不会破坏批处理文件,您可以在末尾添加它,并根据需要强制使用双引号。

>>> import subprocess
>>> print subprocess.list2cmdline(['1|2 '])
"1|2 "

关于python - 在 Windows 上,如何使用 Python 2.7 子进程保护 shell 脚本的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4970194/

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