Je veux affecter la sortie d'une commande que j'exécute os.system
à une variable et l'empêcher d'être sortie à l'écran. Mais, dans le code ci-dessous, la sortie est envoyée à l'écran et la valeur imprimée pour var
0, ce qui signifie, je suppose, si 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 de l'empêcher de s'afficher à l'écran?
var = os.system("cat /etc/services")
print var #Prints 0
os.system
(nios.popen
, selon la réponse que vous avez acceptée): utilisezsubprocess.Popen
, c'est bien mieux!subprocess.Popen
- - ajoutez simplementshell=True
!shell=True
est (généralement) une très mauvaise idée! Vous devez être très sûr de ce que vous exécutez :)Réponses:
De " Equivalent of Bash Backticks in Python ", que j'ai demandé il y a longtemps, ce que vous voudrez peut-être utiliser est
popen
:À partir des documents pour Python 3.6 ,
Voici le code correspondant pour
subprocess
:la source
subprocess.check_output
solution de Walter est plus proche de la doublure Pythonic qu'il semble que vous recherchez, tant que vous ne vous en souciez passtderr
.os.popen
?shell=True
. Voir docs.python.org/3/library/…shell=True
, mais c'est également incorrect dans ce cas.shell=True
fait du shell le processus enfant plutôt quecat
, doncout
eterr
sont les stdout / stderr du processus shell plutôt que ducat
processusVous pourriez également vouloir regarder le
subprocess
module, qui a été construit pour remplacer toute la famille de Pythonpopen
appels de type .L'avantage qu'il a est qu'il y a une tonne de flexibilité avec la façon dont vous appelez les commandes, où les flux d'entrée / sortie / erreur standard sont connectés, etc.
la source
check_output
été ajouté avec python 2.7 docs.python.org/2.7/library/…stderr=subprocess.STDOUT
pour capturer également les erreurs standardLe module de commandes est un moyen raisonnablement de haut niveau de le faire:
l'état est 0, la sortie est le contenu de / etc / services.
la source
Pour python 3.5+, il est recommandé d'utiliser la fonction d'exécution du module de sous-processus . Cela renvoie un
CompletedProcess
objet, à partir duquel vous pouvez facilement obtenir la sortie ainsi que le code retour. Comme vous n'êtes intéressé que par la sortie, vous pouvez écrire un wrapper utilitaire comme celui-ci.la source
Je sais que cela a déjà été répondu, mais je voulais partager un moyen potentiellement meilleur d'appeler Popen via l'utilisation de
from x import x
et les fonctions:la source
cmd.py
, puis dans mon fichier principal, j'ai écritfrom cmd import cmdline
et utilisé au besoin.je le fais avec le fichier temp os.system:
la source
Python 2.6 et 3 disent spécifiquement d'éviter d'utiliser PIPE pour stdout et stderr.
La bonne façon est
la source