77 votes

subprocess.check_output () ne semble pas exister (Python 2.6.5)

J'ai lu la documentation Python sur le sous-processus module (voir ici) et ça parle d'un subprocess.check_output() commande qui semble être exactement ce dont j'ai besoin.

Cependant, lorsque j'essaie de l'utiliser, je reçois une erreur qu'il n'existe pas, et quand je le lance en dir(subprocess) il n'est pas répertorié.

Je suis en cours d'exécution Python 2.6.5, et le code que j'ai utilisé est ci-dessous:

import subprocess
subprocess.check_output(["ls", "-l", "/dev/null"])

Quelqu'un aurait-il une idée de pourquoi ce qui se passe?

121voto

user225312 Points 22699

Il a été introduit dans la version 2.7. Voir la documentation .

Utilisez subprocess.Popen si vous voulez la sortie:

 >>> import subprocess
>>> output = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE).communicate()[0]
 

55voto

technicalbloke Points 565

SI il est largement utilisé dans le code que vous voulez exécuter, mais ce code n'a pas à être maintenus à long terme (ou si vous avez besoin d'une solution rapide, indépendamment du potentiel de l'entretien des maux de tête dans le futur), alors vous pourriez duck punch (alias monkey patch) dans la mesure d'un processus secondaire est importé...

Il suffit de soulever le code de 2,7 et de l'insérer ainsi...

import subprocess

if "check_output" not in dir( subprocess ): # duck punch it in!
    def f(*popenargs, **kwargs):
        if 'stdout' in kwargs:
            raise ValueError('stdout argument not allowed, it will be overridden.')
        process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs)
        output, unused_err = process.communicate()
        retcode = process.poll()
        if retcode:
            cmd = kwargs.get("args")
            if cmd is None:
                cmd = popenargs[0]
            raise subprocess.CalledProcessError(retcode, cmd)
        return output
    subprocess.check_output = f

Mineur de gigoter peut être nécessaire.

Ne garder à l'esprit que le fardeau de la preuve est sur vous pour maintenir sale petit backports de ce genre. Si des bugs sont découverts et corrigés dans la dernière python alors vous un) ont à l'avis et b) de mettre à jour votre version si vous voulez rester en sécurité. Aussi, primordiale et la définition des fonctions internes de vous-même est le gars à côté est pire cauchemar, surtout quand le gars à côté est de plusieurs années sur toute la ligne et que vous avez oublié le grody hacks que vous avez fait la dernière fois! En résumé: c'est très rarement une bonne idée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X