2013-04-12 103 views
0

我想在python使用subprocess module,並試圖獲取的firefox使用子模塊

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 

process id我覺得我得到的命令行參數的,我執行pid從Python的執行命令行命令.. 難道我做錯了什麼? 我確認它是不使用ps aux | grep firefox

回答

2

如果使用shell=True相同,你會得到IST的啓動外殼,不是你想的過程中,的PID特意爲你使用&發送過程到背景中。

您應該使用提供參數的long(list)形式,而不使用&,因爲如果將其與輸出重定向結合使用,則無論如何都毫無意義。

+0

如果我不使用'殼= TRUE',我得到以下錯誤: '回溯(最近通話最後一個): 文件 「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已經在運行,那麼這將無法工作,要麼因爲在這種情況下,Firefox會使用一些IPC告訴現有進程打開一個新窗口,然後終止。