аргумент.

я проблема с подпроцессом и печатью кавычек.

Мой Python-скрипт принимает пользовательский ввод, немного разбивает его - и мне нужно, чтобы он таким образом отправлял свои результаты в bash-скрипт.

myscript.sh 'var1 == a var2 == b; othervar == c' /path/to/other/files

То, где я зацикливаюсь, - это одиночные кавычки. Питон пытается вырвать их.

Я использовал это для моего теста.

subprocess.Popen([myscript.sh 'var=11; ignore all' /path/to/files], shell=True, executable="/bin/bash")

который возвращает неверный синтаксис, указывающий на 2-ую одинарную кавычку. Я также попробовал вышеупомянутое без скобок и использования одинарных кавычек снаружи и двойных кавычек внутри и т. Д.

Другое - хотелось бы.

Как я уже говорил выше, 'var == a var == b; othervar == c 'является производным от скрипта Python (в строковом формате) - и мне нужно вызвать это в подпроцессе следующим образом.

subprocess.Popen([myscript.sh myvariables /path/to/files], shell=True, executable="/bin/bash")

Мне просто нужно поместить одинарные кавычки вокруг значения myvariables, как в первом примере.

Любые указатели относительно того, где я ухожу от правильного метода?

Спасибо.

 user39576025 янв. 2011 г., 21:17
Я думаю, что у нас сегодня есть эта ошибка. Что заставляет людей думать, что это верный синтаксис? Элементы списка разделяются запятыми, точка. И пустойfoo не имеет ничего общего со строкой"foo", (Также: я не смог бы уточнить пример, который вы цитируете, не могли бы вы указать номер строки?)

Ответы на вопрос(3)

Это список, это строки в нем, поэтому им нужны кавычки:

["myscript.sh", "var=11; ignore all", "/path/to/files"]

Это должно работать. Если ваш сценарий действительно каким-то образом основан на кавычках, попробуйте это (я не знаю деталей того, как работает подпроцесс):

["myscript.sh", "'var=11; ignore all'", "/path/to/files"]
 user39576025 янв. 2011 г., 21:25
я верюsubprocess заботится о добавлении кавычек, когда это необходимо - если это вообще происходит через оболочку (я полагаю, что существуют способы вызова программы и указания аргументов, которые не требуют склеивания имени исполняемого файла и аргументов в одной большой строке, которая должна быть проанализирована некоторыми ракушка ;))
 Thomas K25 янв. 2011 г., 21:27
@delnan: Да, я думаю, что ты прав. Обновлено.
 Ken Kinder25 янв. 2011 г., 21:29
Это не совсем так в этом случае. Если вы используете shell = True, то подпроцесс позволяет оболочке вычислять кавычки. Это буквально то, что вы вводите в командной строке.
 Thomas K25 янв. 2011 г., 21:33
@Ken: Вы правы, я пропустил использованиеshell=True аргумент.
Решение Вопроса

вы передаете все, что отправляете в командной строке. Это означает, что в вашем списке должен быть только один элемент. Так, например:

subprocess.Popen(['myscript.sh "var=11; ignore all" /path/to/files'], shell=True, executable="/bin/bash")

Или, если / path / to / files является переменной в вашей среде Python:

subprocess.Popen(['myscript.sh "var=11; ignore all" %s' % path_to_files], shell=True, executable="/bin/bash")

Сказав, что яСИЛЬНО рекомендуем вам не использовать аргумент оболочки. Причина в хрупкости. Вы получите гораздо более надежный способ сделать это следующим образом:

subprocess.Popen(["/bin/bash", "myscript.sh", "var=11; ignore all", path_to_files])

Обратите внимание, что «var = 11; ignore all» передается как один аргумент в ваш скрипт. Если это отдельные аргументы, сделайте их отдельными элементами списка.

 Chasester29 янв. 2011 г., 15:01
не смог заставить его работать без shell = True, но это сработало. subprocess.Popen (['myscript.sh "% s"% s'% (varfilter, thepath)], shell = True, исполняемый файл = "/ bin / bash"
 Thomas K25 янв. 2011 г., 21:35
Еще одна причина не использоватьshell=True в том, что это может быть небезопасно, в зависимости от того, откуда поступает информация. Это можно подать на вход, который будет выполнять другие команды в вашей системе.

почему это работает, но работает и без необходимости shell = True.

subprocess.Popen(["/bin/bash", "myscript.sh", '""' + string_to_be_quoted + '""', path_to_files])

Ваш ответ на вопрос