Comment faire pour déterminer le pid du processus qui a commencé par de l'os.système
Je veux commencer plusieurs sous-processus avec un programme, c'est à dire un module foo.py
commence plusieurs instances de bar.py
.
Depuis j'ai parfois l'arrêter manuellement, j'ai besoin de l'id de processus pour effectuer une commande kill.
Même si l'ensemble de l'installation est assez “sale”, est-il un bon pythonic façon à obtenir un processus de’ pid
, si le processus est lancé via os.system
?
foo.py:
import os
import time
os.system("python bar.py \"{0}\ &".format(str(argument)))
time.sleep(3)
pid = ???
os.system("kill -9 {0}".format(pid))
bar.py:
import time
print("bla")
time.sleep(10) % within this time, the process should be killed
print("blubb")
"c'est pourquoi le sous-processus
Oui, j'ai mesuré. Il était autour de 20 à 30 ms, qui a été dans mon cas précis, trop lent, depuis que j'ai eu un défilement graphique, qui devait être mis à jour plusieurs fois par seconde.
Vous devriez l'ai mentionné dans la question (idéalement, avec un minimum de code exemple que d'autres personnes peuvent essayer). Méfiez-vous
Quelques détails au sujet de mon programme: Une permanence (plusieurs fois par seconde) mise à jour de schéma défile de droite à gauche. Dans
Après avoir fait plusieurs autres modifications, je me suis rendu compte que je ne peux pas reproduire le plus de temps pour le démarrage d'un processus par Popen, ni la seconde lors du démarrage d'un processus par Popen. Je vais modifier la question pour faire la accepté de répondre à l'ajustement et de révoquer ma solution. Désolé de vous déranger, je n'ai aucune idée de où mes résultats précédents sont venus.
Popen(["python", "bar.py", "arguments"])
est trop lent." -- avez-vous réellement mesuré? La question que vous avez lié affiche les différents cas et de toute façon la différence de temps est de quelques millisecondes.Oui, j'ai mesuré. Il était autour de 20 à 30 ms, qui a été dans mon cas précis, trop lent, depuis que j'ai eu un défilement graphique, qui devait être mis à jour plusieurs fois par seconde.
os.spawnl
m'a donné la fonctionnalité désirée, même si elle a ajouté environ une seconde au début de chaque processus, mais sans s'y arrêter mon processus principal. Il n'est pas encore la solution idéale, mais pour mon cas bettern que subprocess.Popen
.Vous devriez l'ai mentionné dans la question (idéalement, avec un minimum de code exemple que d'autres personnes peuvent essayer). Méfiez-vous
spawn
hérite de toutes héritées des descripteurs de fichiers (Popen
ferme (Python 3)). Pouvez-vous démarrer le processus avant de la main et de les mettre en veille et ensuite seulement de réactiver (envoi de données d'entrée ou un signal)? Pourquoi ne pouvez-vous pas utiliser bar.py
script dans le même processus? btw, pourquoi spawn
permettrait d'ajouter une seconde au démarrage d'un processus par rapport à Popen
?Quelques détails au sujet de mon programme: Une permanence (plusieurs fois par seconde) mise à jour de schéma défile de droite à gauche. Dans
bar.py
, plusieurs temps de calculs sont faits. Tandis que les calculs ne sont pas effectués, il est écrit “calcul” dans le diagramme. Si l'utilisateur effectue une entrée, les calculs doivent être résilié et les nouveaux calculs ont commencé. Il est moins important, que les résultats des calculs sont faits rapidement, que le schéma ne se déplacer en douceur. La raison de la seconde ne sont pas clairs pour moi.Après avoir fait plusieurs autres modifications, je me suis rendu compte que je ne peux pas reproduire le plus de temps pour le démarrage d'un processus par Popen, ni la seconde lors du démarrage d'un processus par Popen. Je vais modifier la question pour faire la accepté de répondre à l'ajustement et de révoquer ma solution. Désolé de vous déranger, je n'ai aucune idée de où mes résultats précédents sont venus.
OriginalL'auteur Sebastian Werk | 2013-11-26
Vous devez vous connecter pour publier un commentaire.
os.system
retour code de sortie. Il ne fournit pas de pid du processus fils.Utilisation
sous-processus
module.Pour terminer le processus, vous pouvez utiliser
résilier
méthode oukill
. (Pas besoin d'avoir recours à deskill
programme)Selon
os.spawn*
de documentation, "on Remarque que le sous-processus module fournit plus puissant des installations pour la ponte des nouveaux processus et de la récupération de leurs résultats; l'utilisation de ce module est préférable à l'utilisation de ces fonctions. ..."Je sais, à cet effet, je l'ai utilisé en premier lieu, mais il faut environ 20ms pour lancer un processus sur mon ordinateur, et c'est un peu trop long ):
Comment au sujet de l'affichage MODIFIER partie de votre question que d'y répondre et de l'accepter au lieu d'essayer de fermer votre question?
Ok, merci quand même.
OriginalL'auteur falsetru
Partage ma solution au cas où cela peut aider les autres:
J'ai pris l'info de cette page pour exécuter une fortran exe en arrière-plan. J'ai essayé d'utiliser le système d'exploitation.forkpty pour obtenir le pid de lui, mais il na pas donner le pid de mon processus. Je ne peux pas utiliser les sous-processus, parce que je n'ai pas trouver comment il serait permettez-moi de lancer mon processus en arrière-plan.
Avec l'aide d'un collègue, j'ai trouvé ceci:
Dans le cas de vouloir ajouter pid dans le même fichier, utiliser la double flèche.
OriginalL'auteur Damaris
Vous pouvez utiliser
os.forkpty()
au lieu de cela, ce qui, comme le code de résultat, vous donne le pid et fd pour le pseudo-terminal. Plus de la documentation ici: http://docs.python.org/2/library/os.html#os.forkptyos.spawnl(...)
échoueOriginalL'auteur Tobias Wärre