7
votes

Sortie de subprocess.popen

J'ai écrit du code Python et dans mon code, j'utilisais "Commande"

Le code travaillait comme je l'avais voulu, mais j'ai remarqué dans les documents de Python que la commande a été obsolète et sera supprimée en python 3 Et que je devrais utiliser "Subprocess" à la place. P>

"OK" Je pense que je ne veux pas que mon code soit directement au statut d'héritage, je devrais donc changer cela en ce moment. P >

La chose est que SubProcess.Popen semble préparer une chaîne méchante au début de toute sortie, par exemple p> xxx pré>

Tous les exemples que je vois l'avoir là-bas, il semble que d'être accepté comme étant donné qu'il est toujours là. p>

Ce code; p> xxx pré>

produit ceci; P>

brettg@underworld:~/dev$ ./IPAddress.py
OLD IP is : 10.48.16.60

NEW IP is : <subprocess.Popen object at 0xb744270c>
brettg@underworld:~/dev$ 10.48.16.60


1 commentaires

Je ne peux pas répondre, je dois donc le faire dans des commentaires [CUT] HMMM, le code de publication dans les commentaires ne fonctionne pas du tout. Je suppose que je devrai revenir en 8 heures et poster une réponse. Malheureusement, c'est vendredi après-midi maintenant, donc je ne peux pas le garantir.


3 Réponses :


6
votes

La "chaîne laidule" est ce qu'elle devrait être une impression. Python imprime correctement le REC (SubProcess.popen (...)) , comme ce qu'il imprimerait si vous avez dit Imprimer (Ouvrir (myfile.txt ')) .

En outre, Python n'a aucune connaissance de ce qui est en cours de sortie sur stdout. La sortie que vous voyez est pas de Python, mais à partir du STDOUT du processus et de STDROUT étant redirigé vers votre terminal comme spam, cela ne traverse même pas le processus Python. C'est comme si vous avez exécuté un programme quelque programme sans rediriger son stdout et STDERR sur / dev / null , puis essayé d'exécuter une autre commande, mais vous voyez occasionnellement du spam de le programme. Pour répéter et clarifier: xxx

Pour capturer stdout, vous devez utiliser la fonction .Communicat () fonction, comme: xxx

En outre, vous ne voulez jamais utiliser shell = true , car il s'agit d'un trou de sécurité (un trou de sécurité majeur avec des entrées insanitaires, une mineure sans entrée Parce qu'il permet aux attaques locales en modifiant l'environnement Shell). Pour des raisons de sécurité et également pour éviter les insectes, vous souhaitez généralement transmettre une liste plutôt qu'une chaîne. Si vous êtes paresseux, vous pouvez faire "LS -Al" .Split (), qui est froncé, mais ce serait un trou de sécurité de faire quelque chose comme ("LS -L% S"% d'insanituation) .split ().


3 commentaires

Je reçois ce que vous dites de la sécurité de Shell = TRUE, mais ce programme sera utilisé de manière très limitée, donc je ne suis pas trop inquiet. Toutefois, à des fins de compréhension, je préférerais le faire la "bonne façon", mais je ne peux pas comprendre la bonne façon de pipe entre les commandes, c'est-à-dire "LS -al | grep quelque chose". Utilisation de Shell = TRUE, je peux simplement mettre tout cela dans une chaîne et cela fonctionne. Sans c'est ce que je fais? Pouvez-vous string Subprocess.Pipes? J'ai trouvé quelques exemples suggérant que vous pouvez, mais je travaille toujours sur la syntaxe. Quoi qu'il en soit, merci encore.


@Brett (Eh bien il y a des moments rares, vous voudrez peut-être utiliser Shell = true, j'exagère un peu) mais pour simuler des tuyaux que vous pouvez utiliser popen.commiquez docs.python.org/library/... ou les pipes module href = "http://docs.python.org/library/pipes.html" rel = "nOfollow noreferrer"> docs.python.org/library/pipes.html


Merci encore, je l'ai eu surtout compris mais je ne peux pas poster mon code parce que j'ai une mauvaise réputation ;-)



0
votes

voir le Documentation de module sous-processus pour plus d'informations.

ici est comment obtenir STDOUT et STDERR à partir d'un programme à l'aide du module de sous-processus: p> xxx pré>

résultats: p> xxx pré>

vous pouvez exécuter Commandes avec PowerShell et voir Résultats: P>

from subprocess import Popen, PIPE, STDOUT
cmd = 'powershell.exe ls'
p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
output = p.stdout.read()


0 commentaires

1
votes

La variable sortie code> ne contient pas de chaîne, il s'agit d'un conteneur pour la fonction subprocess.popen () code>. Vous n'avez pas besoin de l'imprimer. Le code,

import subprocess
output = subprocess.Popen("ls -al", shell=True)


0 commentaires