![](/img/trans.png)
[英]How can I run multiple shell commands at once through a Python subprocess on Windows?
[英]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.