Frage

Ich möchte mehrere Befehle in einer Zeile auszuführen:

d. (Nur mein Bedürfnis zu erläutern):

cmd (die Shell)

dann

cd dir

und

ls

und das Ergebnis der ls lesen.

Jede Idee mit subprocess Modul?

Update:

cd dir und ls sind nur ein Beispiel. Ich brauche komplexe Befehle ausführen (nach einer bestimmten Reihenfolge, ohne Pipelining). In der Tat würde ich eine subprocess Schale mag und die Fähigkeit, viele Befehle auf sie zu starten.

War es hilfreich?

Lösung

Es gibt eine einfache Möglichkeit, eine Folge von Befehlen auszuführen.

Verwenden Sie die folgenden in subprocess.Popen

"command1; command2; command3"

Oder, wenn Sie mit Fenstern stecken, haben Sie mehrere Möglichkeiten.

  • Erstellen Sie einen temporären ".BAT" -Datei, und dies subprocess.Popen bietet

  • Erstellen eine Folge von Befehlen mit "\ n" Separatoren in einem einzigen langen String.

Verwenden Sie "" "s, wie diese.

"""
command1
command2
command3
"""

Oder, wenn Sie die Dinge Stück für Stück tun müssen, haben Sie so etwas wie dies zu tun.

class Command( object ):
    def __init__( self, text ):
        self.text = text
    def execute( self ):
        self.proc= subprocess.Popen( ... self.text ... )
        self.proc.wait()

class CommandSequence( Command ):
    def __init__( self, *steps ):
        self.steps = steps
    def execute( self ):
        for s in self.steps:
            s.execute()

Das erlaubt Ihnen eine Folge von Befehlen zu bauen.

Andere Tipps

Um das zu tun, würden Sie haben:

  • liefern das shell=True Argument in dem subprocess.Popen Anruf, und
  • trennen die Befehle mit:
    • ; wenn läuft unter einem * nix-Shell (bash, Asche, sh, ksh, csh, tcsh, zsh usw.)
    • & wenn unter dem cmd.exe von Windows ausgeführt

Finding 'bar' in jeder Datei, deren Name 'foo':

from subprocess import Popen, PIPE
find_process = Popen(['find', '-iname', '*foo*'], stdout=PIPE)
grep_process = Popen(['xargs', 'grep', 'bar'], stdin=find_process.stdout, stdout=PIPE)
out, err = grep_process.communicate()

'out' und 'err' sind String-Objekte die Standardausgabe und schließlich enthalten, die Fehlerausgabe.

Ja, die subprocess.Popen() Funktion unterstützt ein cwd Schlüsselwort-Argument, mit dem Sie das Verzeichnis festlegen können sie den Prozess laufen in.

Ich denke, der erste Schritt, der Schal, nicht erforderlich ist, wenn alles, was Sie wollen ls laufen soll, gibt es keine Notwendigkeit ist es durch eine Shell auszuführen.

Natürlich könnten Sie auch passieren nur das gewünschte Verzeichnis als Argument an ls.

Update: Es könnte sein, bemerkenswert, dass für typische Muscheln, cd in der Schale ausgeführt ist selbst, es ist nicht ein externer Befehl auf dem Datenträger. Dies liegt daran, es muss das aktuelle Verzeichnis -Prozess ändern, die aus dem Prozess heraus getan werden muss. Da Befehle als Kind laufen verarbeitet, von der Shell hervorgebracht, können sie dies nicht tun.

unter Python-Skript haben 3-Funktion, was Sie wollen nur ausführen:

import sys
import subprocess

def cd(self,line):
    proc1 = subprocess.Popen(['cd'],stdin=subprocess.PIPE)
    proc1.communicate()

def ls(self,line):
    proc2 = subprocess.Popen(['ls','-l'],stdin=subprocess.PIPE)
    proc2.communicate()

def dir(silf,line):
    proc3 = subprocess.Popen(['cd',args],stdin=subprocess.PIPE)
    proc3.communicate(sys.argv[1])
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top