2013-04-12 2 views
0

Я пытаюсь использовать subprocess module в питоне и пытаюсь принести process id из firefoxВыполнения команд командной строки из Python с помощью модуля подпроцесса

cmd = "firefox &" 
fire = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE, preexec_fn=os.setsid) 
fire_task_procs = find_task(fire.pid) 
print "fire_task_procs",fire_task_procs 

Я думаю, что я набираюсь pid из командной строки аргумента, что я уверен, выполнение .. Я делаю что-то неправильно? Я подтвердил, что это не то же самое, используя ps aux | grep firefox

ответ

2

Если вы используете shell=True Идентификатора вы получите IST, что запущенная оболочки, не то, что в процессе вы хотите, специально, как вы используете & для отправки процесса в фоновом режиме.

Вы должны использовать длинную (список) форму подачи параметров без &, так как это не имеет никакого смысла, если вы сочетаете его с перенаправлением вывода.

+0

Если я не использую 'оболочки = true', я получаю следующее сообщение об ошибке: ' Traceback (самый последний вызов последний): Файл "test.py", строка 33, в огонь = subprocess.Popen (cmd, stdout = subprocess.PIPE, preexec_fn = os.setsid) Файл «/usr/lib/python2.7/subprocess.py», строка 679, в __init__ errread, errwrite) Файл «/ usr/lib/python2.7/subprocess.py ", строка 1259, в _execute_child raise child_exception OSError: [Errno 2] Нет такого файла или каталога' – rnish

+0

Если вы не используете' shell = True', и вы передаете строку '' firefox & "', вы получите сообщение об ошибке, потому что это не разумная строка arg. (В зависимости от вашей платформы, это может попросить «firefox» открыть файл с именем '&', или он может попытаться найти программу с именем «firefox &», ни одна из которой не является правильной.) Но если вы просто отпустите '& ', это так. И в идеале переключитесь на список arg. (Как говорят документы несколько раз: «Предоставление последовательности аргументов обычно предпочтительнее», когда вы не используете 'shell = True', особенно на POSIX.) Итак, измените' cmd' на '[" firefox "]' , – abarnert

1

Не использовать оболочку, а не просто использовать

subprocess.Popen(['firefox'], stdout=subprocess.PIPE, preexec_fn=os.setsid) 

Однако, если Firefox уже запущен, то это не будет работать либо, так как в этом случае светлячок будет использовать некоторые IPC сказать существующий процесс, чтобы открыть новое окно, а затем завершается.

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