web-dev-qa-db-fra.com

Suppression de la sortie dans python appel de sous-processus

Pour la commande suivante:

subprocess.call(shlex.split(
            """/usr/local/itms/bin/iTMSTransporter -m lookupMetadata 
              -Apple_id %s -destination %s"""%(self.Apple_id, self.destination))

Il imprime la sortie entière dans la fenêtre Terminal. Comment supprimer toutes les sorties ici? J'ai essayé de faire subprocess.call(shlex.split(<command> > /dev/null 2&1)), mais cela n'a pas produit les résultats requis. Comment pourrais-je faire cela ici?

36
David542

Vous pouvez utiliser les paramètres stdout= Et stderr= Pour subprocess.call() pour diriger stdout ou stderr vers un descripteur de fichier de votre choix. Alors peut-être quelque chose comme ça:

import os

devnull = open(os.devnull, 'w')
subprocess.call(shlex.split(
    '/usr/local/itms/bin/iTMSTransporter -m lookupMetadata '
    '-Apple_id %s -destination %s' % (self,Apple_id, self.destination)),
  stdout=devnull, stderr=devnull)

L'utilisation de subprocess.PIPE, Si vous ne lisez pas dans le tube, pourrait bloquer votre programme s'il génère beaucoup de sortie.

Mise à jour

Comme @yanlend le mentionne dans un commentaire, les nouvelles versions (3.x) de Python incluent subprocess.DEVNULL Pour résoudre ce problème de manière plus pratique et portable. Dans ce cas, le le code ressemblerait à:

subprocess.call(shlex.split(
    '/usr/local/itms/bin/iTMSTransporter -m lookupMetadata '
    '-Apple_id %s -destination %s' % (self,Apple_id, self.destination)),
  stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
50
larsks

Ce qui a fonctionné pour moi, c'est d'ajouter 2>/dev/null à la fin de la commande.

5
David542