Mis a jour le 2024-10-20, 20:14

Lancement de process

La nouvelle méthode de haut niveau est run :
Comment lancer un commande avec un pipe tout en vérifiant que tout s'est bien passé ?
Anciennes méthodes :
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