繁体   English   中英

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

[英]On Windows, how can I protect arguments to shell scripts using Python 2.7 subprocess?

考虑以下Python代码:

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

在这里,我在tst.bat的参数周围放了双引号,以保护'|' 从shell开始,因为tst.bat最终将通过Windows shell运行。 但是,如果参数中有双引号,则Python 2.7中的子进程会逃避它们。 结果是tst.bat接收到这个参数:\\“1 | 2 \\”。

如何逃避参数“1 | 2”,以便它传递给tst.bat?

在给出的参数列表的情况下,在Windows子模块的call方法转换这个名单到使用字符串list2cmdline功能。 在这个函数的docstring中可以读到:

3)以反斜杠开头的双引号被解释为文字双引号。

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

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上提出了一个错误

UPDATE

事实证明我对list2cmdline函数的误导性文档字符串感到困惑 - 有关详细信息,请参阅http://bugs.python.org/issue18649

传递给自变量的序列subprocess.call由翻译list2cmdline其与由MS C运行时,而不是由通过引用cmd.exe的使用机构中使用的引用机制只关注功能。 这使得传递参数 - 后来被cmd.exe解释 - 传递给subprocess.call作为一个非常笨拙或不可能的列表。

但是,在这种情况下还有一次机会让它运转起来。 list2cmdline double引用内部有空格或制表符的每个参数。 如果在参数末尾有空格不会破坏批处理文件,则可以在最后添加它以强制双引号。

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

这个(或类似的问题)已被报告为一个错误。

参考文献:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM