[Python] Lancer un programme bash
Résolu/Fermé
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
-
16 mai 2005 à 21:46
quamenzullo - 23 avril 2012 à 16:58
quamenzullo - 23 avril 2012 à 16:58
A voir également:
- [Python] Lancer un programme bash
- Lancer un programme au demarrage - Guide
- Programme demarrage windows 10 - Guide
- Bash do while ✓ - Forum Shell
- Citizen code python avis - Accueil - Outils
13 réponses
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
16 mai 2005 à 21:47
16 mai 2005 à 21:47
Plusieurs solutions:
os.system("macommande")
ou bien (si tu veux récupérer la sortie):
os.popen("macommande")
os.system("macommande")
ou bien (si tu veux récupérer la sortie):
os.popen("macommande")
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
17 mai 2005 à 18:53
17 mai 2005 à 18:53
Je viens d'essayer os.fork() après avoir glané quelques renseignements sur le fonctionnement général d'un fork (en C mais bon on dirait que c'est le même fonctionnement).
Par exemple j'ai mon appli bash appelée dans une fonction launch_dwl()
J'ai donc fait comme ça:
Ô bonheur, ça marche, apparemment les instructions du processus parent et child se sont executés en même temps :-)
Mais alors du coup.... Parce que j'aimerais lancer deux fork() en même temps.... Il faudrait que je connaisse le pid des processus enfant pour les arrêter régulièrement et les relancer.
J'ai essayé de mettre c=os.getpid() pour le bloc if des instructions du processus enfant mais je n'ai pas réussi à trouver son processus....
Par exemple là dans le fichier "les_pids" je n'ai pas les numeros de processus. Peut être que ce n'est pas os.getpid()
Merci en tout cas :-)
Par exemple j'ai mon appli bash appelée dans une fonction launch_dwl()
J'ai donc fait comme ça:
a=os.fork() if a==0: # Processus enfant si j'ai bien compris launch_dwl() else: #Ce que je voudrait executer en même temps, mais dans le processus parent
Ô bonheur, ça marche, apparemment les instructions du processus parent et child se sont executés en même temps :-)
Mais alors du coup.... Parce que j'aimerais lancer deux fork() en même temps.... Il faudrait que je connaisse le pid des processus enfant pour les arrêter régulièrement et les relancer.
J'ai essayé de mettre c=os.getpid() pour le bloc if des instructions du processus enfant mais je n'ai pas réussi à trouver son processus....
b=os.fork() if b==0: launch_dwl() c=os.getpid() else: a=open("./les_pids","w") d=os.getpid() a.write(c+"\n"+d) a.close()
Par exemple là dans le fichier "les_pids" je n'ai pas les numeros de processus. Peut être que ce n'est pas os.getpid()
Merci en tout cas :-)
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
21 mai 2005 à 17:37
21 mai 2005 à 17:37
Petit retour après coup.
Je n'arrivais pas à killer le processus enfant parce que apparemment os.system crée encore un nouveau processus, et peut être même que le fait d'appeler ma commande en executant un fichier bash engendrait un nouveau processus pour ce script bash, et peut être encore un autre pour l'application lancée dans le script bash...bref on en fini plus.... Le Pid renvoyé par os.fork() n'était donc pas le bon.
Sur Usenet on m'a conseillé d'utiliser os.spawn* qui permet d'executer une commande (de terminal) directement en lui attribuant son propre processus.
Donc j'ai pris os.spawnlp (pour lancer une commande à partir du path) et dedans j'ai mis ma commande directement au lieu de l'appeler dans un script bash.
Là ça fonctionne bien, j'arrive à killer ce processus mais pour qu'il ne reste pas en Zombie il faut aussi mettre os.waitpid(-1,os.WNOHANG) et voilà :-)
Je n'arrivais pas à killer le processus enfant parce que apparemment os.system crée encore un nouveau processus, et peut être même que le fait d'appeler ma commande en executant un fichier bash engendrait un nouveau processus pour ce script bash, et peut être encore un autre pour l'application lancée dans le script bash...bref on en fini plus.... Le Pid renvoyé par os.fork() n'était donc pas le bon.
Sur Usenet on m'a conseillé d'utiliser os.spawn* qui permet d'executer une commande (de terminal) directement en lui attribuant son propre processus.
Donc j'ai pris os.spawnlp (pour lancer une commande à partir du path) et dedans j'ai mis ma commande directement au lieu de l'appeler dans un script bash.
Là ça fonctionne bien, j'arrive à killer ce processus mais pour qu'il ne reste pas en Zombie il faut aussi mettre os.waitpid(-1,os.WNOHANG) et voilà :-)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
17 mai 2005 à 12:16
17 mai 2005 à 12:16
Ah ok je comprends mieux.
Bon le problème c'est que je dois vraiment les faire tourner en même temps. Je dois même les contrôler toutes les x secondes pour voir si le process s'est arrêté, et en ce cas le relancer.
Et ce sript ne bougera pas de chez moi, et ça ne peux se faire que sous Linux donc je vais opter pour os.fork()
(et surtout je me sens pas d'attaque pour les sockets et Semaphore :-)
Merci Seb , j'irais voir la doc là dessus ce soir :-)
Bon le problème c'est que je dois vraiment les faire tourner en même temps. Je dois même les contrôler toutes les x secondes pour voir si le process s'est arrêté, et en ce cas le relancer.
Et ce sript ne bougera pas de chez moi, et ça ne peux se faire que sous Linux donc je vais opter pour os.fork()
(et surtout je me sens pas d'attaque pour les sockets et Semaphore :-)
Merci Seb , j'irais voir la doc là dessus ce soir :-)
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
16 mai 2005 à 21:51
16 mai 2005 à 21:51
Réponse lapidaire :-)
Merci beaucoup...
Mais je suis pas au bout de mes peines. Il va falloir que je lance deux programmes bash en threads différents... J'essaie de voir ça tout seul mais je sens que je vais avoir besoin d'aide...
A bientôt sûrement :-D
Merci beaucoup...
Mais je suis pas au bout de mes peines. Il va falloir que je lance deux programmes bash en threads différents... J'essaie de voir ça tout seul mais je sens que je vais avoir besoin d'aide...
A bientôt sûrement :-D
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
16 mai 2005 à 22:26
16 mai 2005 à 22:26
Bon je pense que ça ne vaut pas le coup de relancer un nouveau sujet pour ça.
Alors j'ai deux scripts bash:
main et dwl_raw
Et dans le même repertoire j'ai mon fichier machin.py
Les deux scripts bash marchent très bien indépendamment, et aussi quand je les lance avec os.system()
Le soucis c'est que quand je les lance en thread, je n'ai rien. Le fichier python se termine silencieusement, même quand je le fait patienter 2 minutes. Et les scripts bash ne se sont pas exécutés.
Voici le script python:
Avec les print a et print b j'ai:
<Thread(Thread-2, initial)>
<Thread(Thread-1, initial)>
C'est la première fois que j'explore les threads et je ne connais pas le fonctionnement.... Je sais pas trop où est le soucis....
Re merci d'avance :-)
Alors j'ai deux scripts bash:
main et dwl_raw
Et dans le même repertoire j'ai mon fichier machin.py
Les deux scripts bash marchent très bien indépendamment, et aussi quand je les lance avec os.system()
Le soucis c'est que quand je les lance en thread, je n'ai rien. Le fichier python se termine silencieusement, même quand je le fait patienter 2 minutes. Et les scripts bash ne se sont pas exécutés.
Voici le script python:
#!/usr/bin/python import threading,time,os def launch_main(): os.system("./main") def launch_dwl(): os.system("./dwl_raw") b=threading.Thread(target=launch_dwl) b.start a=threading.Thread(target=launch_main) a.start time.sleep(20) print a print b
Avec les print a et print b j'ai:
<Thread(Thread-2, initial)>
<Thread(Thread-1, initial)>
C'est la première fois que j'explore les threads et je ne connais pas le fonctionnement.... Je sais pas trop où est le soucis....
Re merci d'avance :-)
À l'œil nu, avant de te poser des questions compliqués de fonctionnement du système d'exploitation tu devrais essayer d'appeler les méthodes a.start en mettant les parenthèses comme ceci : a.start()
a.start est seulement la méthode start liée à l'objet a; alors que a.start() est le résultat de l'appel de cette méthode
Ceci dit l'intérêt de lancer ces commandes dans des threads est inextistant puisque de toute façon la commande os.system crée un nouveau processus.
Cordialement.
a.start est seulement la méthode start liée à l'objet a; alors que a.start() est le résultat de l'appel de cette méthode
Ceci dit l'intérêt de lancer ces commandes dans des threads est inextistant puisque de toute façon la commande os.system crée un nouveau processus.
Cordialement.
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
>
dave
29 août 2008 à 14:41
29 août 2008 à 14:41
os.system() est bloquant, c'est donc intéressant de les lancer dans des threads.
Ça permet au programme de continuer à travailler en attendant la fin des programmes (et il pourra éventuellement récupérer la valeur retournée par os.system() pour savoir si tout s'est bien passé).
Ça permet au programme de continuer à travailler en attendant la fin des programmes (et il pourra éventuellement récupérer la valeur retournée par os.system() pour savoir si tout s'est bien passé).
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
17 mai 2005 à 09:53
17 mai 2005 à 09:53
Le problème, c'est que lancer 2 scripts en même temps, ça veut dire deux process, pas deux threads.
Chaque script a besoin de son propre process.
Il est donc impossible de lancer les 2 scripts simultanément dans un seul process (même si ce process a plusieurs threads).
Donc il faut:
- soit faire tourner les deux script l'un après l'autre.
- soit lancer 2 instances de ton programme Python (en trouvant un moyen pour les faire communiquer (sockets, sémaphores, etc.)
- soit faire forker ton programme Python (os.fork(), mais qui n'est pas disponible sous Windows).
Chaque script a besoin de son propre process.
Il est donc impossible de lancer les 2 scripts simultanément dans un seul process (même si ce process a plusieurs threads).
Donc il faut:
- soit faire tourner les deux script l'un après l'autre.
- soit lancer 2 instances de ton programme Python (en trouvant un moyen pour les faire communiquer (sockets, sémaphores, etc.)
- soit faire forker ton programme Python (os.fork(), mais qui n'est pas disponible sous Windows).
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
17 mai 2005 à 20:22
17 mai 2005 à 20:22
Je ne sais pas trop.
Je n'ai jamais bidouillé avec les pid.
Je n'ai jamais bidouillé avec les pid.
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
17 mai 2005 à 21:08
17 mai 2005 à 21:08
Po grave, merci quand même :-)
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
17 mai 2005 à 22:21
17 mai 2005 à 22:21
J'ai compris.
Quand je fais:
a.write(c+"\n"+d)
Le problème est que c est une variable issue du processus enfant, donc ça crée une erreur, elle n'est pas reconnue dans le processus parent....
Il faudrait par exemple écrire le pid du proc enfant dans un fichier lors de l'execution du processus enfant....
Voilà voilà... Po grave ça fait un ptit fichier en plus pour connaître ce pid.
Voilà c'est bon j'ai tout ce qu'il me faut maintenant :-)
Quand je fais:
a.write(c+"\n"+d)
Le problème est que c est une variable issue du processus enfant, donc ça crée une erreur, elle n'est pas reconnue dans le processus parent....
Il faudrait par exemple écrire le pid du proc enfant dans un fichier lors de l'execution du processus enfant....
Voilà voilà... Po grave ça fait un ptit fichier en plus pour connaître ce pid.
Voilà c'est bon j'ai tout ce qu'il me faut maintenant :-)
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
17 mai 2005 à 22:25
17 mai 2005 à 22:25
ok :-)
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 659
22 mai 2005 à 13:20
22 mai 2005 à 13:20
ok merci de l'info.
Modifié par brupala le 16/08/2014 à 13:30
Toute la doc (en anglais) : https://docs.python.org/3/library/subprocess.html