la lecture d'un os.popen(commande) dans une chaîne

Je ne suis pas sûr que mon titre soit correct. Ce que je fais, c'est Écrire un script python pour automatiser une partie de mon écriture de code. Donc, je suis d'analyse par le biais d'un .h fichier. mais je veux étendre toutes les macros avant de commencer. donc je veux faire un appel au shell pour:

gcc -E myHeader.h

qui devrait sortir la version pré-traitée de myHeader.h à stdout. Maintenant je veux lire toute cette sortie directement dans une chaîne de caractères pour un traitement ultérieur. J'ai lu que je peux le faire avec popen, mais Je n'ai jamais utilisé objets de tuyau.

comment faire?

14
demandé sur Lyndon White 2010-02-26 07:17:42

5 réponses

la fonction os.popen renvoie simplement un objet ressemblant à un fichier. Vous pouvez l'utiliser comme ceci:

import os

process = os.popen('gcc -E myHeader.h')
preprocessed = process.read()
process.close()

comme d'autres l'ont dit, vous devriez utiliser subprocess.Popen . Il est conçu pour être une version plus sûre de os.popen . Les docs Python ont une section qui décrit comment basculer sur .

22
répondu Brian McKenna 2010-02-26 22:54:25
import subprocess

p = subprocess.popen('gcc -E myHeader.h'.split(),
                     stdout=subprocess.PIPE)
preprocessed, _ = p.communicate()

String preprocessed a maintenant la source pré-traitée dont vous avez besoin -- et vous avez utilisé la" bonne "(moderne) façon de shell à un sous-processus, plutôt que Vieux pas-si-aimé-plus os.popen .

16
répondu Alex Martelli 2010-02-26 06:03:23

vous devez utiliser subprocess.Popen() il y a de nombreux exemples sur DONC

Comment obtenir la sortie de subprocess.Popen ()

5
répondu John La Rooy 2017-05-23 12:00:31

Le os.popen () a été déprécié depuis Python 2.6. Vous devez maintenant utiliser le sous-processus module à la place: http://docs.python.org/2/library/subprocess.html#subprocess.Popen

import subprocess

command = "gcc -E myHeader.h"  # the shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, shell=True)

#Launch the shell command:
output = process.communicate()

print output[0]

dans le constructeur Popen, si shell est True , vous devez passer la commande comme une chaîne de caractères plutôt que comme une séquence. Sinon, il suffit de diviser le commande dans une liste:

command = ["gcc", "-E", "myHeader.h"]  # the shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None)

si vous avez besoin de lire aussi l'erreur standard, dans l'initialisation Popen, vous pouvez définir stderr à subprocess.Tubes ou à la sous-procédure .STDOUT :

import subprocess

command = "gcc -E myHeader.h"  # the shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

#Launch the shell command:
output, error = process.communicate()
1
répondu Paolo Rovelli 2013-04-28 19:14:36

Voici une autre approche qui saisit à la fois la sortie régulière et la sortie d'erreur:

com_str = 'uname -a'
command = subprocess.Popen([com_str], stdout=subprocess.PIPE, shell=True)
(output, error) = command.communicate()
print output

Linux 3.11.0-20-generic  Fri May 2 21:32:55 UTC 2014 GNU/Linux

et

com_str = 'id'
command = subprocess.Popen([com_str], stdout=subprocess.PIPE, shell=True)
(output, error) = command.communicate()
print output

uid=1000(myname) gid=1000(myGID) groups=1000(mygrp),0(root)
0
répondu SDsolar 2018-03-29 05:45:53