Проблема подпроцесса Python с амперсандами

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

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

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

  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 Solutions collect form web for “Проблема подпроцесса Python с амперсандами”

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

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

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

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

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

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

«ускользнуть от амперсанда с помощью ^»

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

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

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

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

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

 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) 

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

  • Python 3 Windows Sevice запускается только в режиме отладки
  • Почему os.path.exists («C: \\ windows \\ system32 \\ inetsrv \\ metaback») возвращает False, даже если он существует?
  • PyDev Offline install
  • Установка lxml, libxml2, libxslt в Windows 8.1
  • Настройка файла pylint config.rc по умолчанию в Windows
  • Компилятор HTMLHelp отлично работает из командной строки, но не запускается из сценария или пакетного файла
  • Как использовать цвет в командной строке Windows с помощью Python?
  • Не удается установить ggplot с anaconda
  • Python - лучший язык программирования в мире.