Comment appeler un script shell à partir de code python?
211
Le module de sous-processus vous aidera.
Exemple manifestement trivial:
>>> import subprocess
>>> subprocess.call(['./test.sh']) # Thanks @Jim Dennis for suggesting the []
0
>>>
Où test.sh
est un simple script shell et 0
sa valeur de retour pour cette exécution.
chmod +x script.sh
. Remarque: script.sh est un espace réservé pour votre script, remplacez-le en conséquence.Il existe certaines façons d'utiliser
os.popen()
(obsolète) ou l'ensemble dusubprocess
module, mais cette approcheest l'un des plus faciles.
la source
subprocess
vous pouvez gérer les canaux d'entrée / sortie / erreur. C'est aussi mieux lorsque vous avez de nombreux arguments - avecos.command()
vous devrez créer une ligne de commande entière avec des caractères spéciaux d'échappement, avec unesubprocess
simple liste d'arguments. Mais pour des tâches simples, celaos.command()
peut suffire.The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; *using that module is preferable to using this function.*
Dans le cas où vous souhaitez passer certains paramètres à votre script shell, vous pouvez utiliser la méthode shlex.split () :
avec
test.sh
dans le même dossier:Les sorties:
la source
En supposant que test.sh est le script shell que vous souhaitez exécuter
la source
Utilisez le module de sous-processus comme mentionné ci-dessus.
Je l'utilise comme ceci:
la source
J'utilise python 3.5 et subprocess.call (['./ test.sh']) ne fonctionne pas pour moi.
Je vous donne trois solutions dépend de ce que vous voulez faire avec la sortie.
1 - script d'appel. Vous verrez la sortie dans votre terminal. la sortie est un nombre.
2 - exécution et vidage de l'appel et erreur dans la chaîne. Vous ne voyez pas l'exécution dans votre terminal à moins que vous n'imprimiez (stdout). Shell = True car l'argument dans Popen ne fonctionne pas pour moi.
3 - appeler le script et vider les commandes d'écho de temp.txt dans temp_file
N'oubliez pas de jeter un œil au sous-processus doc
la source
subprocess.call
. Le processus enfant se bloquera s'il génère suffisamment de sortie vers un tuyau pour remplir le tampon de tuyau du système d'exploitation car les tuyaux ne sont pas lus.Le module de sous-processus est un bon module pour lancer des sous-processus. Vous pouvez l'utiliser pour appeler des commandes shell comme ceci:
Vous pouvez voir sa documentation ici.
Si votre script est écrit dans un fichier .sh ou une longue chaîne, vous pouvez utiliser le module os.system. C'est assez simple et facile à appeler:
Cette commande exécutera le script une fois, jusqu'à la fin, et bloquera jusqu'à ce qu'il se termine.
la source
Dans le cas où le script contient plusieurs arguments
La sortie donnera le code d'état. Si le script s'exécute correctement, il donnera 0 sinon un entier différent de zéro.
Voici le script shell test.sh.
la source
Le sous-processus est bon mais certaines personnes préfèrent le scriptine . Scriptine a un ensemble de méthodes de plus haut niveau comme shell.call (args) , path.rename (nouveau_nom) et path.move (src, dst) . Le script est basé sur un sous-processus - et d'autres.
Deux inconvénients de la scriptine:
la source
Je sais que c'est une vieille question mais je suis tombé dessus récemment et cela a fini par me tromper depuis le sous- processus API de sous- changé depuis python 3.5.
La nouvelle façon d'exécuter des scripts externes est avec la
run
fonction, qui exécute la commande décrite par args. Attend la fin de la commande, puis retourne une instance de CompletedProcess.la source
Si votre fichier de script shell n'a pas d'autorisations d'exécution, procédez comme suit.
la source
Veuillez essayer les codes suivants:
la source