Comment appeler un script shell à partir du code python?

Comment appeler un script shell à partir du code python?

153
demandé sur u449355 2010-09-23 14:12:57

9 réponses

Le module subprocess vous aidera.

Exemple manifestement trivial:

>>> import subprocess
>>> subprocess.call(['./test.sh']) # Thanks @Jim Dennis for suggesting the []
0 
>>> 

test.sh est un script shell simple et 0 est sa valeur de retour pour cette exécution.

168
répondu Manoj Govindan 2017-10-07 03:15:35

Il y a quelques façons d'utiliser os.popen() (obsolète) ou l'ensemble du module subprocess, mais cette approche

import sys, os

os.system(command)

Est l'un des plus faciles.

64
répondu Michał Niklas 2017-01-04 19:12:56

Si vous voulez passer certains paramètres à votre script shell, vous pouvez utiliser la méthode shlex.split():

import subprocess
import shlex
subprocess.call(shlex.split('./test.sh param1 param2'))

Avec test.sh dans le même dossier:

#!/bin/sh
echo $1
echo $2
exit 0

Sorties:

$ python test.py 
param1
param2
33
répondu Franck Dernoncourt 2015-08-13 18:26:41

Utilisez le module subprocess comme mentionné ci-dessus.

Je l'utilise comme ceci:

subprocess.call(["notepad"])
13
répondu hugo24 2010-09-23 10:19:35
import os
import sys

En supposant test.sh est le script shell que vous souhaitez exécuter

os.system("sh test.sh")
13
répondu Srayan Guhathakurta 2016-05-27 08:23:09

Je cours 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. résultat est un nombre.

import subprocess 
output = subprocess.call(['test.sh'])

2-appelez et videz l'exécution et l'erreur dans la chaîne. Vous ne voyez pas l'exécution dans votre terminal sauf si vous imprimez (stdout). Shell=True comme argument dans Popen ne fonctionne pas pour moi.

import subprocess
from subprocess import Popen, PIPE

session = subprocess.Popen(['test.sh'], stdout=PIPE, stderr=PIPE)
stdout, stderr = session.communicate()

if stderr:
    raise Exception("Error "+str(stderr))

3-appelez le script et videz le commandes d'écho de temp.txt dans temp_file

import subprocess
temp_file = open("temp.txt",'w')
subprocess.call([executable], stdout=temp_file)
with open("temp.txt",'r') as file:
    output = file.read()
print(output)

N'oubliez pas de jeter un oeil au sous-processus doc

6
répondu lauralacarra 2016-09-05 08:46:25

Le sous-processus est bon mais certaines personnes peuvent aimer scriptine mieux. Scriptine a plus d'ensemble de méthodes de haut niveau comme shell.appel(args), chemin d'accès.renommer (nouveau_nom) et chemin.déplacer(src,dst). Scriptine est basé sur subprocess et d'autres.

Deux inconvénients de scriptine:

  • le niveau de documentation actuel serait plus complet même s'il est suffisant.
  • contrairement au sous-processus, le paquet scriptine ne installé par défaut.
2
répondu Akseli Palén 2013-02-03 19:33:35

Le module Subprocess est un bon module pour lancer des sous-processus. Vous pouvez l'utiliser pour appeler des commandes shell comme ceci:

subprocess.call(["ls","-l"]);
#basic syntax
#subprocess.call(args, *)

Vous pouvez voir sa documentation ici.

Si vous avez écrit votre script dans un fichier. sh ou une longue chaîne, vous pouvez utiliser os.système de module. C'est assez simple et facile à appeler:

import os
os.system("your command here")
# or
os.system('sh file.sh')

Cette commande exécutera le script une fois, jusqu'à la fin, et bloquera jusqu'à sa sortie.

2
répondu Ankit Singh 2016-06-16 19:53:45

Veuillez essayer les codes suivants:

Import Execute 

Execute("zbx_control.sh")
-7
répondu Manas 2015-05-12 20:42:21