Kaip paleisti „Python“ procesą?

Stengiuosi perkelti scenarijų apvalkalą į daug aiškesnę „python“ versiją. Kaip galiu pasiekti tą patį poveikį pythone? Norėčiau, kad šie procesai nebūtų mirę, kai python scenarijus baigsis. Esu tikras, kad tai kažkaip yra susijusi su demono samprata, bet aš negalėjau rasti, kaip tai padaryti lengvai.

213
28 июля '09 в 21:56 2009-07-28 21:56 Artemas yra nustatytas liepos 28 d., 09:21, 2009-07-28 21:56
@ 7 atsakymai

Pastaba Šis atsakymas yra ne toks svarbus kaip tada, kai jis buvo paskelbtas 2009 m. Dabar rekomenduojama naudoti subprocess modulį, rodomą kituose atsakymuose dokumentuose.

(Atkreipkite dėmesį, kad subproceso modulis suteikia daugiau galingų funkcijų, leidžiančių kurti naujus procesus ir gauti jų rezultatus; naudojant šį modulį pageidautina naudoti šias funkcijas.)


Jei norite, kad jūsų procesas būtų pradėtas fone, galite naudoti system() ir skambinti jį kaip ir jūsų apvalkalo scenarijų, arba galite ją spawn :

 import os os.spawnl(os.P_DETACH, 'some_long_running_command') 

(arba galite išbandyti mažiau nešiojamą „ os.P_NOWAIT vėliavą).

Žr. Dokumentaciją čia .

66
28 июля '09 в 22:05 2009-07-28 22:05 atsakymą pateikė „ jkp“ liepos 28 d., 09 val. 10:05 2009-07-28 22:05

Nors jkp sprendimas veikia, naujesnis būdas (ir būdas, kurį rekomenduoja dokumentacija) yra naudoti subprocess modulį. Paprastoms komandoms jos ekvivalentas, tačiau jis siūlo daugiau galimybių, jei norite padaryti kažką sudėtingo.

Jūsų bylos pavyzdys:

 import subprocess subprocess.Popen(["rm","-r","some.file"]) 

Fone tai turėtų būti padaryta rm -r somefile . Tačiau būkite atsargūs: subprocess.Popen() paleidžia tik procesą fone, jei niekas iš python scenarijaus nepriklauso nuo vykdomos komandos išvesties:

Pavyzdžiui, ši komanda nebus rodoma fone:

 import subprocess ls_output=subprocess.Popen(["ls", "-a"], stdout=subprocess.PIPE) 

Žr. Dokumentaciją čia .

Be to, aiškinimo taškas: „Fonas“ yra gryna apvalkalo sąvoka: tikriausiai norite sukurti naują procesą. Čia naudoju „foną“, kad galėčiau kalbėti apie korpuso fono tipo elgesį, bet aš neklystu, nes procesas iš tikrųjų yra fone.

300
29 авг. atsakymas duotas Dan 29 rug. 2011-08-29 00:47 '11 prie 0:47 2011-08-29 00:47

Tikriausiai jums reikia atsakymo „Kaip pakviesti išorinę komandą„ Python “ .

Paprasčiausias būdas yra naudoti os.system funkciją, pavyzdžiui:

 import os os.system("some_command > 

Iš esmės, viskas, ką perduodate system funkcijoms, bus vykdoma taip pat, kaip jei ją perduotumėte scenarijai.

32
28 июля '09 в 22:02 2009-07-28 22:02 atsakymą pateikė Eli Courtwright, liepos 28 d., „09“, 10:02 pm 2009-07-28 22:02

Radau čia :

>longtask.py baigs darbą. Tai ne tai, ko norite CGI scenarijuje. Problema nėra būdinga „Python“, problemos PHP bendruomenėje yra tos pačios.

Sprendimas yra perduoti vėliavą „ DETACHED_PROCESS kad procesas būtų sukurtas pagrindinei „ CreateProcess funkcijai laimėjimo API. Jei įdiegėte pywin32, galite importuoti vėliavą iš „win32process“ modulio, kitaip jūs turite jį apibrėžti:

 DETACHED_PROCESS = 0x00000008 pid = subprocess.Popen([sys.executable, "longtask.py"], creationflags=DETACHED_PROCESS).pid 
23
28 нояб. Atsakymas pateiktas lapkričio 28 d. 2012-11-28 00:19 '12 0:19 2012-11-28 00:19

Naudokite subprocess.Popen() su parametru close_fds=True , kuris leidžia atskirti sukurtą subprocesą nuo paties „Python“ proceso ir tęsti darbą net po išėjimo iš „Python“.

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' 
15
25 дек. Atsakymą pateikė Jimmy Yin . 2015-12-25 04:47 '15 at 4:47 2015-12-25 04:47

Galite pradėti tyrinėti „os“ modulį, kad padalintumėte įvairias temas (atidarydami interaktyviąją sesiją ir išduodant pagalbą (os)). Atitinkamos funkcijos yra šakutė ir bet kuri iš vykdomųjų. Norint suteikti jums idėją, kaip pradėti, įdėkite kažką panašaus į funkciją, kuri atlieka šakutę (funkcijos turi sudaryti „args“ sąrašą arba rinkinį kaip argumentą, kuriame yra programos pavadinimas ir jo parametrai, taip pat galite apibrėžti stdin, out ir klaida naujiems srautams):

 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) 
11
28 июля '09 в 22:12 2009-07-28 22:12 atsakymą pateikė Gerald Senarclens de Grancy liepos 28 d., 09:10 10:12 2009-07-28 22:12

Ir užfiksuokite išvestį ir dirbkite fone su threading

Kaip minėta šiame atsakyme , jei stdout= išvestį su stdout= ir tada bandysite read() , procesas bus užblokuotas.

Tačiau yra kartų, kai jums to reikia. Pvz., Norėjau paleisti du procesus, kurie tarpusavyje persijungia per uostą , ir išsaugo standartinę išvestį į žurnalo failą ir standartinę išvestį.

threading modulis leidžia mums tai padaryti.

Pirma, apsvarstykite, kaip atlikti dalį išvesties peradresavimo šiuo klausimu: „ Python Popen“: vienalaikis įrašymas į standartinę išvestį ir žurnalo failą

Tada:

main.py

 #!/usr/bin/env python3 import os import subprocess import sys import threading def output_reader(proc, file): while True: byte = proc.stdout.read(1) if byte: sys.stdout.buffer.write(byte) sys.stdout.flush() file.buffer.write(byte) else: break with subprocess.Popen(['./sleep.py', '0'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) as proc1, \ subprocess.Popen(['./sleep.py', '10'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) as proc2, \ open('log1.log', 'w') as file1, \ open('log2.log', 'w') as file2: t1 = threading.Thread(target=output_reader, args=(proc1, file1)) t2 = threading.Thread(target=output_reader, args=(proc2, file2)) t1.start() t2.start() t1.join() t2.join() 

sleep.py

 #!/usr/bin/env python3 import sys import time for i in range(4): print(i + int(sys.argv[1])) sys.stdout.flush() time.sleep(0.5) 

Paleidus:

 ./main.py 

stdout atnaujinama kas 0,5 sekundės kas dvi eilutes:

 0 10 1 11 2 12 3 13 

ir kiekviename žurnalo faile yra atitinkamas proceso žurnalas.

Įkvėptas: https://eli.thegreenplace.net/2017/interacting-with-a-long-running-child-process-in-python/

Išbandyta „Ubuntu 18.04“, „Python“ 3.6.7.

0
13 дек. Ciro Santilli atsakymas 改造 改造 中心 六四 事件 法轮功 Dec 13 2018-12-13 00:48 '18 0:48 2018-12-13 00:48

Žr. Kitus klausimus apie „ žymes arba užduoti klausimą

"46.216.144.65 - 46.216.144.65"