Модуль подпроцесса в Windows в случае списка аргументов, переданных методу call
, преобразует этот список в строку с помощью функции list2cmdline
.В строке документации этой функции можно прочитать:
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\\\"
Такое же поведение в Python3.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 "