Le blocage et Non de Blocage sous-processus des appels
Je suis complètement confus entre subprocess.call()
, subprocess.Popen()
, subprocess.check_call()
.
Qui bloque et qui ne l'est pas ?
Ce que je veux dire est que si j'utilise subprocess.Popen()
si le processus parent attend pour le processus de l'enfant à return
/exit
avant de les conserver sur son exécution.
Comment shell=True
affecter ces appels?
- avez-vous essayé
subprocess.call([cmd,params,&])
?
Vous devez vous connecter pour publier un commentaire.
Popen
est non bloquante.call
etcheck_call
sont de blocage.Vous pouvez faire la
Popen
instance de bloc en appelant seswait
oucommunicate
méthode.Si vous regardez dans le code source, vous verrez
call
appelsPopen(...).wait()
, c'est pourquoi il est bloquant.check_call
appelscall
, c'est pourquoi il bloque ainsi.À proprement parler,
shell=True
est orthogonal à la question de blocage. Cependant,shell=True
causes Python à un shell exec, puis exécutez la commande dans le shell. Si vous utilisez un blocage de l'appel, l'appel sera de retour lors de la shell finitions. Depuis le shell peut générer un sous-processus de l'exécution de la commande, le shell peut se terminer avant la donné naissance à un processus secondaire. Par exemple,Ici deux processus sont lancés: Popen engendre un sous-processus de l'exécution de l'interpréteur de commandes. La coquille à son tour engendre un sous-processus exécutant
ls
.proc.terminate()
tue le shell, mais le processus secondaire de coursels
reste. (Qui se manifeste par de copieux sortie, même après le script python a pris fin. Être prêt à tuerls
avecpkill ls
.)start_new_session=True
ou de ses analogues permet de résiliation de l'ensemble du processus de l'arbre à la fois. Voir Comment mettre fin à un python sous-processus lancé avec shell=Trueproc = subprocess.Popen(['/run_python.py', '-n', '10'], shell=True)
est différente de celleproc = subprocess.Popen("run_python.py -n 10", shell=True)
Seul le dernier œuvres si la commande est construit au sommet d'un script python.shell=False
si possible. Avecshell=False
, l'approvisionnement de la commande et ses arguments dans une liste:proc = subprocess.Popen(['/run_python.py', '-n', '10'], shell=False)
.proc = subprocess.Popen(['/run_python.py', '-n', '10'], shell=False)
est-ce un processus de blocage? Jerun_python.py
exécuter à l'arrière-plan, qui peut durer de 1 heure.wait
oucommunicate
qui bloque.wait
ma commande ne s'exécute jamais..?subprocess.call([cmd,params,&])
? c'est à dire l'ajout de la norme&
?