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> 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> 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
3 Réponses :
La "chaîne laidule" En outre, Python n'a aucune connaissance de ce qui est en cours de sortie sur stdout. La sortie que vous voyez est Pour capturer stdout, vous devez utiliser la fonction En outre, vous ne voulez jamais utiliser REC (SubProcess.popen (...)) code>, comme ce qu'il imprimerait si vous avez dit
Imprimer (Ouvrir (myfile.txt ')) Code>.
quelque programme CODE> sans rediriger son stdout et STDERR sur
/ dev / null code>, puis essayé d'exécuter une autre commande, mais vous voyez occasionnellement du spam de le programme. Pour répéter et clarifier: p>
.Communicat () code> fonction, comme: P>
shell = true code>, 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 (). p> p>
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 code> docs.python.org/library/... ou les pipes code> module code> 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 ;-)
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> résultats: p> 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()
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)
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.