web-dev-qa-db-fra.com

python getoutput () en sous-processus

Je souhaite obtenir le résultat de certaines commandes du shell telles que ls ou df dans un script python. Je vois que commands.getoutput('ls') est obsolète mais subprocess.call('ls') ne me fournira que le code de retour.

J'espère qu'il y a une solution simple.

59
Rafael T

Utilisez le sous-processus.Popen :

import subprocess
process = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE)
out, err = process.communicate()
print(out)

Notez que les blocs de communication jusqu'à la fin du processus. Vous pouvez utiliser process.stdout.readline () si vous avez besoin du résultat avant sa fin. Pour plus d'informations, voir documentation .

83
Michael Smith

Pour Python> = 2.7, utilisez subprocess.check_output().

http://docs.python.org/2/library/subprocess.html#subprocess.check_output

46
knite

Pour attraper les erreurs avec subprocess.check_output(), vous pouvez utiliser CalledProcessError. Si vous souhaitez utiliser la sortie sous forme de chaîne, décodez-la à partir du bytecode.

# \return String of the output, stripped from whitespace at right side; or None on failure.
def runls():
    import subprocess
    try:
        byteOutput = subprocess.check_output(['ls', '-a'], timeout=2)
        return byteOutput.decode('UTF-8').rstrip()
    except subprocess.CalledProcessError as e:
        print("Error in ls -a:\n", e.output)
        return None
3
Roi Danton