Проблема подпроцесса Python с амперсандами - PullRequest
3 голосов
/ 23 сентября 2008

У меня сейчас серьезная проблема со скриптом Python. Скрипт запускает произвольные команды через обработчик для преобразования неверных отчетов об ошибках в правильные отчеты об ошибках.

Проблема, с которой я столкнулся, заключается в том, чтобы заставить скрипт правильно работать в Windows с помощью команды, которая содержит амперсанды в своем пути. Я пытался процитировать команду, экранируя амперсанд с помощью ^, и ни один из них не работает. У меня сейчас нет идей. Есть предложения?

Чтобы уточнить из текущих ответов:

  1. Я использую модуль подпроцесса
  2. Я передаю командную строку + аргументы в виде списка
  3. Проблема связана с путем к самой команде, а не с любым из аргументов
  4. Я пытался процитировать команду. Это вызывает [Error 123] The filename, directory name, or volume label syntax is incorrect ошибка
  5. Я не использую аргумент оболочки (поэтому shell=false)
  6. В случае, если это имеет значение, я беру канал в stderr для его обработки, но игнорирую stdout и stdin
  7. В настоящее время он используется только в Windows и работает, как и ожидалось, во всех других случаях, которые я тестировал до сих пор.
  8. Сбой команды:

p = subprocess.Popen (prog, stderr = subprocess.PIPE, bufsize = -1)

, когда первый элемент списка 'prog' содержит амперсанды. Процитирование этой первой строки не работает.

Ответы [ 6 ]

5 голосов
/ 23 сентября 2008

Убедитесь, что вы используете списки и не используете расширение оболочки:

subprocess.Popen(['command', 'argument1', 'argument2'], shell=False)
1 голос
/ 23 сентября 2008

"выход из амперсанда с ^"

Вы уверены, что ^ является escape-символом для Windows? Разве вы не должны использовать \?

1 голос
/ 23 сентября 2008

Попробуйте процитировать аргумент, содержащий &

wget "http://foo.com/?bar=baz&baz=bar"

Обычно это то, что нужно сделать в оболочке Linux

1 голос
/ 23 сентября 2008

Для правильного ответа потребуется больше информации. Что ты на самом деле делаешь? Как это терпит неудачу? Вы используете модуль подпроцесса? Вы передаете список аргументов и shell = False (или нет аргумента оболочки), или вы действительно вызываете оболочку?

0 голосов
/ 04 января 2014

Я пробую ситуацию следующим образом:

exe = 'C:/Program Files (x86)/VideoLAN/VLC/VLC.exe'
url = 'http://translate.google.com/translate_tts?tl=en&q=hello+world'
subprocess.Popen([exe, url.replace("&","^&")],shell=True)

Это работает.

0 голосов
/ 23 сентября 2008

Чтобы ответить на мой вопрос:

Цитирование фактической команды при передаче параметров в виде списка работает неправильно (команда является первым элементом списка), поэтому для решения проблемы я превратил список в строку, разделенную пробелами, и вместо этого передал ее в подпроцесс.

Лучшие решения по-прежнему приветствуются.

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