python隐藏启动台_如何在Python中启动后台进程?
如何在Python中啟動(dòng)后臺(tái)進(jìn)程?
我正在嘗試將shell腳本移植到更易讀的python版本。 原始shell腳本在后臺(tái)使用“&”啟動(dòng)多個(gè)進(jìn)程(實(shí)用程序,監(jiān)視器等)。 如何在python中實(shí)現(xiàn)相同的效果? 我希望這些進(jìn)程不會(huì)在python腳本完成時(shí)死掉。 我確信它與守護(hù)進(jìn)程的概念有某種關(guān)系,但我無法輕易找到如何做到這一點(diǎn)。
Artem asked 2019-03-01T10:26:16Z
6個(gè)解決方案
299 votes
雖然jkp的解決方案有效,但更新的處理方式(以及文檔推薦的方式)是使用subprocess.Popen()模塊。 對(duì)于簡單的命令,它是等價(jià)的,但是如果你想做一些復(fù)雜的事情,它會(huì)提供更多選項(xiàng)。
案例示例:
import subprocess
subprocess.Popen(["rm","-r","some.file"])
這應(yīng)該在后臺(tái)運(yùn)行subprocess.Popen()。 但要小心:subprocess.Popen()只在后臺(tái)運(yùn)行進(jìn)程,如果python腳本中沒有任何內(nèi)容依賴于正在運(yùn)行的命令的輸出:
例如,以下命令不會(huì)在后臺(tái)運(yùn)行:
import subprocess
ls_output=subprocess.Popen(["ls", "-a"], stdout=subprocess.PIPE)
請參閱此處的文檔。
另外,澄清一點(diǎn):“背景”純粹是一個(gè)shell概念:你可能想要的是產(chǎn)生一個(gè)新的過程。 我在這里使用“背景”來引用類似shell的背景行為,但是不要將其誤認(rèn)為實(shí)際存在于后臺(tái)的進(jìn)程。
Dan answered 2019-03-01T10:28:12Z
65 votes
注意:此答案比2009年發(fā)布時(shí)的答案要少。現(xiàn)在,在文檔中建議使用其他答案中顯示的os.P_NOWAIT模塊
(請注意,子進(jìn)程模塊提供了更強(qiáng)大的工具來生成新進(jìn)程并檢索其結(jié)果;使用該模塊比使用這些函數(shù)更好。)
如果您希望您的進(jìn)程在后臺(tái)啟動(dòng),您可以使用os.P_NOWAIT并以與shell腳本相同的方式調(diào)用它,或者您可以使用spawn:
import os
os.spawnl(os.P_DETACH, 'some_long_running_command')
(或者,您可以嘗試使用較不便攜的os.P_NOWAIT標(biāo)志)。
請參閱此處的文檔。
jkp answered 2019-03-01T10:26:57Z
32 votes
您可能想要“如何在Python中調(diào)用外部命令”的答案。
最簡單的方法是使用system函數(shù),例如:
import os
os.system("some_command &")
基本上,無論您傳遞給system函數(shù)的任何內(nèi)容都將執(zhí)行,就像您在腳本中將其傳遞給shell一樣。
Eli Courtwright answered 2019-03-01T10:28:54Z
23 votes
我在這里找到了這個(gè):
在Windows(win xp)上,父進(jìn)程將無法完成,直到DETACHED_PROCESS完成其工作。 這不是你想要的CGI腳本。 問題不是Python特有的,在PHP社區(qū)中問題是一樣的。
解決方案是將DETACHED_PROCESS進(jìn)程創(chuàng)建標(biāo)志傳遞給win API中的基礎(chǔ)CreateProcess函數(shù)。 如果你碰巧安裝了pywin32,你可以從win32process模塊導(dǎo)入標(biāo)志,否則你應(yīng)該自己定義:
DETACHED_PROCESS = 0x00000008
pid = subprocess.Popen([sys.executable, "longtask.py"],
creationflags=DETACHED_PROCESS).pid
f p answered 2019-03-01T10:29:43Z
15 votes
使用subprocess.Popen()和close_fds=True參數(shù),這將允許生成的子進(jìn)程與Python進(jìn)程本身分離,并在Python退出后繼續(xù)運(yùn)行。
[https://gist.github.com/yinjimmy/d6ad0742d03d54518e9f]
import os, time, sys, subprocess
if len(sys.argv) == 2:
time.sleep(5)
print 'track end'
if sys.platform == 'darwin':
subprocess.Popen(['say', 'hello'])
else:
print 'main begin'
subprocess.Popen(['python', os.path.realpath(__file__), '0'], close_fds=True)
print 'main end'
Jimmy Yin answered 2019-03-01T10:30:25Z
11 votes
您可能希望開始調(diào)查os模塊以分叉不同的線程(通過打開交互式會(huì)話并發(fā)出幫助(os))。 相關(guān)函數(shù)是fork和任何exec函數(shù)。 為了讓你了解如何啟動(dòng),在執(zhí)行fork的函數(shù)中放入這樣的東西(函數(shù)需要將列表或元組'args'作為包含程序名稱及其參數(shù)的參數(shù);您可能還需要 為新線程定義stdin,out和err):
try:
pid = os.fork()
except OSError, e:
## some debug output
sys.exit(1)
if pid == 0:
## eventually use os.putenv(..) to set environment variables
## os.execv strips of args[0] for the arguments
os.execv(args[0], args)
Gerald Senarclens de Grancy answered 2019-03-01T10:30:53Z
總結(jié)
以上是生活随笔為你收集整理的python隐藏启动台_如何在Python中启动后台进程?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python用海伦公式求面积_Pytho
- 下一篇: python新奇检测_3种Python检