subprocess.Popen не экранирует аргументы командной строки правильно? - PullRequest
3 голосов
/ 19 июля 2011

Я пытаюсь вызвать следующую команду curl с python:

curl -k -F file=@something.zip -F "data={\\"title\\":\\"Another App\\"}" -Lu usr:pwd https://build.phonegap.com/api/v0/apps

Чтобы это работало, я обнаружил, что json, который я передаю в данные, должен быть экранирован обратной косой чертой.

Я могу вызвать эту команду с помощью ...

os.system(curl -k -F file=@something.zip -F "data={\\"title\\":\\"Another App\\"}" -Lu usr:pwd https://build.phonegap.com/api/v0/apps)

, и она работает.

Однако, когда я пытаюсь использовать модуль подпроцесса, как этот ...

s = 'curl -k -F file=@something.zip -F "data={\\"title\\":\\"Another App\\"}" -Lu usr:pwd https://build.phonegap.com/api/v0/apps'
push = subprocess.Popen(s.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, errors = push.communicate()
print output

... curl не работает, и я получаю сообщение об ошибке из APIиспользуя это, я использую недопустимые параметры, которые я получил в прошлом, когда использовал неправильно экранированный json.

Что здесь происходит?Почему я могу вызвать эту команду с помощью os.system, а не subprocess.Popen?До сих пор моя гипотеза состояла в том, что расщепление что-то портит в строке, но я не нашел ничего, что выглядело неправильно, когда я проверял вывод s.split().

Ответы [ 3 ]

6 голосов
/ 19 июля 2011

возможно используя shell = True

push = subprocess.Popen(s, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
4 голосов
/ 19 июля 2011

Вместо выполнения

s.split()

попробуйте использовать shlex из стандартной библиотеки

import shlex
shlex.split(s)

Shlex позволяет настроить режим экранирования (подробности см. По ссылке).хотя значения по умолчанию могут быть достаточными)

1 голос
/ 19 июля 2011

Конкретно, где вы идете не так, разделяется на:

\ "Другой, App \ "}"

.split()# 

использует пробел по умолчанию вам нужно изменить поведение разделения, как говорили другие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...