434 votes

Assigner la sortie de os.system à une variable et l'empêcher d'être affichée à l'écran

Je veux assigner la sortie d'une commande que je lance en utilisant os.system à une variable et l'empêcher d'être affichée à l'écran. Mais, dans le code ci-dessous ,la sortie est envoyée à l'écran et la valeur imprimée pour la variable var est 0, ce qui signifie, je suppose, que la commande s'est exécutée avec succès ou non. Existe-t-il un moyen d'affecter la sortie de la commande à la variable et d'empêcher son affichage à l'écran ?

var = os.system("cat /etc/services")
print var #Prints 0

8 votes

N'utilisez pas os.system (ni os.popen (selon la réponse que vous avez acceptée) : utiliser subprocess.Popen c'est chemin mieux !

1 votes

@AlexMartelli, on ne peut pas utiliser une commande complexe (par exemple piped) dans subprocess.Popen(), mais avec os.system on peut

2 votes

@vak, bien sûr vous pouvez utiliser des pipes &c w/ subprocess.Popen -- ajoutez simplement shell=True !

6voto

lexa-b Points 1261

Je le fais avec le fichier temporaire os.system :

import tempfile,os
def readcmd(cmd):
    ftmp = tempfile.NamedTemporaryFile(suffix='.out', prefix='tmp', delete=False)
    fpath = ftmp.name
    if os.name=="nt":
        fpath = fpath.replace("/","\\") # forwin
    ftmp.close()
    os.system(cmd + " > " + fpath)
    data = ""
    with open(fpath, 'r') as file:
        data = file.read()
        file.close()
    os.remove(fpath)
    return data

3voto

Kearney Taaffe Points 378

Les versions 2.6 et 3 de Python indiquent spécifiquement qu'il faut éviter d'utiliser PIPE pour stdout et stderr.

La manière correcte est

import subprocess

# must create a file object to store the output. Here we are getting
# the ssid we are connected to
outfile = open('/tmp/ssid', 'w');
status = subprocess.Popen(["iwgetid"], bufsize=0, stdout=outfile)
outfile.close()

# now operate on the file

-1voto

lestat_kim Points 190
from os import system, remove
from uuid import uuid4

def bash_(shell_command: str) -> tuple:
    """

    :param shell_command: your shell command
    :return: ( 1 | 0, stdout)
    """

    logfile: str = '/tmp/%s' % uuid4().hex
    err: int = system('%s &> %s' % (shell_command, logfile))
    out: str = open(logfile, 'r').read()
    remove(logfile)
    return err, out

# Example: 
print(bash_('cat /usr/bin/vi | wc -l'))
>>> (0, '3296\n')```

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