Mis a jour le 2021-07-25, 10:35

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é :
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 :
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