2013-11-19 6 views
0

Я хочу использовать функцию os.spawn * для вызова службы выскочки. Причина использования os.spawn над подпроцессом заключается в том, что вызовы os.spawn обеспечивают больший контроль над тем, как запускается программа, хотя и с небольшой сложной сигнатурой вызова.процесс нереста в python

Моя команда:

sudo start service/new_service db=tmp 

Я не уверен, как запустить командную строку с помощью os.spawn * функции семьи.

+1

Почему вы не можете использовать 'subprocess' для этого? Ваше утверждение «Больше контроля» основано на том, что именно? Модуль 'subprocess' разработан специально для нужд, которые вам нужны, и команда, которую вы подробно описали в своем вопросе, является совершенно нормальной командой для запуска с подпроцессом. –

+0

Я первоначально использовал подпроцесс следующим образом: 'subprocess.Popen ('sudo start service/new_service db = tmp', shell = True, stderr = subprocess.STDOUT)' Однако даже после завершения дочернего процесса вызывающий процесс не прекращается , –

ответ

0

только «больше контроля», который os.spawn дает вам более subprocess является mode аргумент - но на Unix, это может контролировать только ли блоки вызова ждет подпроцесса, чтобы закончить, который также выполнимо с subprocess.

В любом случае, лучший способ превратить вашу команду в список аргументов, чтобы использовать функцию shlex.split, в соответствии с рекомендациями subprocess документы:

command = 'sudo start service/new_sevice db=tmp' 
subprocess.call(shlex.split(command)) 

Если вы действительно хотите использовать os.spawn* (и вы, вероятно, этого не делаете), вы также можете использовать shlex.split - он дает свой результат в форме subprocess ожидает, что немного отличается от формы os.spawn*, но вы можете обойти это достаточно легко, используя варианты spawnl* и распаковку аргументов Python :

os.spawnlp(os.P_WAIT, *shlex.split(command)) 
+0

Я могу полностью использовать подпроцесс, если основной процесс вызова завершается с завершением дочернего процесса, чего в моем случае не происходит. Я использовал эту команду 'subprocess.Popen ('sudo start service/new_service db = tmp', shell = True, stderr = subprocess.STDOUT)' Да, порождение дочернего процесса также должно быть неблокирующим. –

+0

@ S-T Я тоже не думаю, что это будет с 'os.spawn *'. Лучший способ добиться этого (так как вы не хотите блокировать ожидание окончания ребенка), скорее всего, проверит, что 'proc.poll() иногда не является« Нет »(где« proc »- это возвращаемое значение« Popen ») - как только это условие истинно, дочерний процесс остановился. В качестве альтернативы, вы можете использовать стандартный модуль «многопроцессорности» для игры с двойными вилками - создать новый процесс Python, единственное задание которого состоит в том, чтобы блокировать ожидание порожденного 'sudo', а затем завершать себя и его родителя. – lvc

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