> Modules standards > Autres modules > Lancement de process
Lancement de process
status = subprocess.call(['ls', '-ls']) : appel système avec la liste des arguments, le stdout et le stderr du programme appelé sont redirigés vers celui du script python. Le statut de retour est fourni et l'appel est bloquant.
status = subprocess.call('ls -ls', shell = True) : exécute directement la ligne de commande (avec les risques de sécurité qui vont avec). L'appel est bloquant.
Redirection du stdout ou stderr du programme appelé :
- status = subprocess.call('ls -ls', stdout = myFh, shell = True) : on fournit un filehandle, myFh, dans lequel le stdout du programme fini (pareil avec stderr et stdin).
- subprocess.call(['ls', '-ls'], stdout = sys.stderr.fileno()) : pour rediriger le stdout d'un programme vers stderr.
- fh = open(os.devnull, 'w'); subprocess.call('ls -ls', stdout = fh, stderr = fh, shell = True) : pour supprimer toute sortie stdout ou stderr du programme appelé.
subprocess.check_call('ls -lsX', shell = True) : lève une exception subprocess.CalledProcessError si erreur (et l'erreur contient le code de retour, la commande appelé et l'output éventuel). L'appel est bloquant également.
try:
subprocess.check_call('ls -lsz', shell = True)
except subprocess.CalledProcessError as e:
print(e.returncode)
print(e.cmd)
print(e.output)
subprocess.check_output :
- out = subprocess.check_output('ls -ls', shell = True) : lève aussi une exception subprocess.CalledProcessError, mais renvoie l'output de la commande dans la variable (ici out). L'appel est bloquant.
- subprocess.check_output(..., text = True) : l'input et l'output sont des strings.
- subprocess.check_output('my commandshell = True, executable = '/bin/bash') : indique d'utiliser bash (par défaut, c'est sh qui est utilisé.
Si on veut lancer une commande dont on veut récupérer le stdout et le stderr même si l'exécution s'est mal passée :
popen = subprocess.Popen(myCommand, shell = True, stdin = None, stdout = subprocess.PIPE, stderr = subprocess.PIPE, encoding = 'utf8'); (out, err) = popen.communicate()
on peut alors avoir le code de sortie avec popen.returncode pour vérifier s'il est à 0 ou non.
Le paramètre encoding est nécessaire si on veut récupérer des strings, sinon, ce sont des bytes par défaut.
Pour lancer une commande et lire l'output immédiatement au fur et à mesure :
myPopen = subprocess.Popen(com, shell = True, stdout = subprocess.PIPE, encoding = 'ascii')
while True:
line = myPopen.stdout.readline()
if line == '' and myPopen.poll() is not None:
break
...
returnStatus = myPopen.poll()
if returnStatus != 0:
raise RuntimeError('Problem')
Pour lancer une commande qui génère un tableau et lire l'output au fur et à mesure :
popen = subprocess.Popen('samtools view ' + bamFile, stdout = subprocess.PIPE, shell = True, encoding = 'utf8')
reader = csv.reader(popen.stdout, delimiter = '\t')
for line in reader:
...
popen.wait()
if popen.returncode != 0:
raise RuntimeError('Error')
Appel système général avec Popen, bloquant ou non-bloquant :
Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert