sous-processus.check_output() de l'objet module a sortir de l'attribut 'check_output'
Je suis à jouer avec les sous-processus de la bibliothèque. Je peux effectuer
v = subprocess.check_output("ls")
et il fonctionne très bien. Cependant, quand j'ai SSH sur une machine et je veux effectuer une commande hadoop,
v = subprocess.check_output("hadoop fs -ls /path/to/file* | grep -oE '/(.*)'")
- Je obtenir
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'check_output'
Pas très bien pourquoi. Je pense qu'il pourrait être mon manque de compréhension de sous-processus. Comment puis-je corriger cette erreur?
quelle version de python sur la machine distante?
2.6.7
2.6.7
OriginalL'auteur Liondancer | 2014-11-12
Vous devez vous connecter pour publier un commentaire.
check_output
a été introduit danspython 2.7
afin de ne pas travailler pour< 2.7
.Vous pouvez utiliser
Popen
aveccommunicate
pour obtenir la sortie.Cette partie de la documentation peut être utile
Je vais ajouter quelque chose dans un couple de minutes
J'ai lu environ Popen et que les blocages se produisent? C'est quelque chose que je suis inquiet. Comment pourrais-je empêcher cela de se produire?
voulez-vous dire l'utilisation de plusieurs processus?
Si vous regardez les sources de
check_output
vous allez voir que c'est exactement ce qui est décrit dans la réponse. Il a un tas d'autres code pour définir les arguments et de gérer les exceptions, mais ce qu'il fait est tout simplement de créer unPopen
et appelcommunicate
. La remarque que vous faites référence n'est valide que lorsque le sous-processus produit beaucoup de données. Dans de tels cas, vous devez lire "paresseusement" dans le processus destdout
pour éviter la mise en mémoire tampon.OriginalL'auteur Padraic Cunningham
Voici ma version de sous-processus.check_output fonction pour Python 2.6 et il prend en charge les canalisations le long de avec l'habituelle interface de commande.
Appel d'essai:
De sortie:
OriginalL'auteur v.babak
padraic-cunningham, tandis que votre réponse m'a fait une partie du chemin, dans mon cas, la commande est une commande SSH. Depuis communiquer tue mon processus prématurément(dès qu'il lit un caractère EOF), j'ai trouvé ce qui suit fonctionne mieux:
OriginalL'auteur MVanOrder