подпроцесс python, вызывающий скрипт bash - тоже нужно выводить кавычки - PullRequest
3 голосов
/ 25 января 2011

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

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

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

Я зацикливаюсь на одиночных кавычках.Python пытается вырвать их.

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

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

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

Другое - как-бы.

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

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

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

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

Спасибо.

Ответы [ 3 ]

7 голосов
/ 25 января 2011

Когда shell = True передается в Popen, вы передаете все, что отправляете в командной строке.Это означает, что в вашем списке должен быть только один элемент.Например:

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")

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

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

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

2 голосов
/ 12 сентября 2012

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

subprocess.Popen(["/bin/bash", "myscript.sh", '""' + string_to_be_quoted + '""', path_to_files])
0 голосов
/ 25 января 2011

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

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

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

["myscript.sh", "'var=11; ignore all'", "/path/to/files"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...