web-dev-qa-db-fra.com

Comment appeler un script shell à partir du code python?

Comment appeler un script shell à partir du code python?

182
u449355

Le module sous-processus vous aidera.

Exemple carrément trivial:

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

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

216
Manoj Govindan

Il y a des façons d'utiliser os.popen() (obsolète) ou le module entier subprocess, mais cette approche

import os
os.system(command)

est l'un des plus faciles.

86
Michał Niklas

Si vous souhaitez transmettre 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

Les sorties:

$ python test.py 
param1
param2
38
Franck Dernoncourt
import os
import sys

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

os.system("sh test.sh")
19

Utilisez le module de sous-processus comme mentionné ci-dessus.

Je l'utilise comme ça:

subprocess.call(["notepad"])
14
hugo24

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.

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

2 - appelle et exporte l'exécution et l'erreur en 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.

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 exportez les commandes echo du fichier temp.txt dans fichier_temp

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 coup d'œil au sous-processus doc

12
lauralacarra

Si le script a plusieurs arguments

#!/usr/bin/python

import subprocess
output = subprocess.call(["./test.sh","xyz","1234"])
print output

La sortie donnera le code de statut. Si le script s'exécute correctement, il donnera 0 sinon un entier différent de zéro.

podname=xyz  serial=1234
0

Vous trouverez ci-dessous le script shell test.sh.

#!/bin/bash

podname=$1
serial=$2
echo "podname=$podname  serial=$serial"
4
Rishi Bansal

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:

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

Vous pouvez voir sa documentation ici.

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

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

Cette commande exécute le script une fois, jusqu'à son achèvement, et le bloque jusqu'à ce qu'il se ferme.

3
Ankit Singh

Le sous-processus est bon mais certaines personnes peuvent aimer scriptine mieux. Scriptine a plus de méthodes de haut niveau comme Shell.call (args) , path.rename (new_name) et path.move (src, dst) . Scriptine est basé sur sous-processus et autres.

Deux inconvénients de la scriptine:

  • Le niveau actuel de documentation serait plus complet même s’il est suffisant.
  • Contrairement au sous-processus, le package scriptine n’est actuellement pas installé par défaut.
2
Akseli Palén

Je sais que c’est une vieille question, mais j’ai trébuché récemment sur cette question et elle m’a mal orientée depuis l’API sous-processus modifiée depuis python 3.5.

La nouvelle façon d'exécuter des scripts externes consiste à utiliser la fonction run.

Import subprocess

subprocess.run(['./test.sh'])
1

Si votre fichier de script Shell ne dispose pas des autorisations d'exécution, procédez de la manière suivante.

import subprocess
subprocess.run(['/bin/bash', './test.sh'])
0
thomasXu