簡體   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