2008-09-23 4 views
3

В настоящее время у меня серьезная проблема с скриптом python. Скрипт выполняет произвольные команды с помощью обработчика, чтобы преобразовать неверные отчеты об ошибках в правильные отчеты об ошибках.Проблема подпроцесса Python с амперсандами

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

Для уточнения от текущих ответов:

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

р = subprocess.Popen (прог, STDERR = subprocess.PIPE, BUFSIZE = -1)

, когда первый элемент списка «prog» содержит любые амперсанды. Цитирование этой первой строки не работает.

+0

«Скрипт» означает, что именно? Что работает на окнах? Что не удается в других ОС? Какие еще ОС? – 2008-09-23 12:41:01

ответ

5

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

subprocess.Popen(['command', 'argument1', 'argument2'], shell=False) 
+1

@ workmad3: из любопытства, какая часть этого ответа помогла? Вы уже дали синтаксис «Popen» выше! – katrielalex 2012-04-14 18:59:51

1

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

1

Try со ссылкой на аргумент, который содержит &

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

Принимают обычно то, что должно быть сделано в Linux оболочки

0

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

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

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

+0

Если вы можете дать нам некоторую * актуальную информацию * о том, что вы делаете и как это не удается, мы могли бы дать вам решение. Покажи нам, что ты делаешь. Покажите нам код и провал. Вот он работает: >>> subprocess.call ([r "c: \ spam & ham \ python.exe", "-c", ""]) >>> – 2008-09-23 12:53:59

+0

сколько еще актуальной информации вы хотите ? Я сказал, что такое ошибка, почему это происходит, и теперь я обновляюсь с линией, которая терпит неудачу для всей предоставляемой им помощи. Больше информации я не могу дать. – workmad3 2008-09-23 13:20:18

1

«побег амперсанд с ^»

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

0

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

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) 

Это делает работу.

Смежные вопросы