Heim > Backend-Entwicklung > Python-Tutorial > Einführung in Methoden auf Unterprozessmodulebene in Python (mit Code)

Einführung in Methoden auf Unterprozessmodulebene in Python (mit Code)

不言
Freigeben: 2019-03-27 09:48:03
nach vorne
3116 Leute haben es durchsucht

Der Inhalt dieses Artikels ist eine Einführung in die Methode auf Unterprozessebene in Python (mit Code). Ich hoffe, dass er für Sie hilfreich ist.

subprocess.run()

Führen Sie den Befehl aus, warten Sie, bis die durch den args-Parameter angegebene Anweisung abgeschlossen ist, und geben Sie die CompletedProcess-Instanz zurück.

Parameter: (*popenargs, input=None, capture_output=False, timeout=None, check=False, **kwargs). Mit Ausnahme von „input“, „capture_output“, „timeout“ und „check“ stimmen andere Parameter mit den Parametern des Popen-Konstruktors überein.

capture_output: Wenn auf True gesetzt, bedeutet dies, dass stdout und stderr an die Pipe umgeleitet werden und keine weiteren stderr- oder stdout-Parameter übergeben werden können, andernfalls wird eine Ausnahme ausgelöst.

Eingabe: Der Eingabeparameter wird als Standardeingabe des Unterprozesses an die Methode Popen.communicate() übergeben und muss eine Zeichenfolge sein (Kodierungs- oder Fehlerparameter müssen angegeben werden, oder Text ist auf festgelegt). True) oder Bytetyp. Nicht-None-Eingabeparameter können nicht zusammen mit stdin-Parametern verwendet werden. Andernfalls wird eine Ausnahme ausgelöst und der zum Erstellen der Popen-Instanz verwendete stdin-Parameter wird als subprocess.PIPE angegeben.

Timeout: Wird an die Methode Popen.communicate() übergeben.

Prüfung: Wenn auf True gesetzt, wird eine CalledProcessError-Ausnahme ausgelöst, wenn die Prozessausführung einen Statuscode ungleich 0 zurückgibt.

# 源码

def run(*popenargs, input=None, capture_output=False, timeout=None, check=False, **kwargs):
    if input is not None:
        if 'stdin' in kwargs:
            raise ValueError('stdin and input arguments may not both be used.')
        kwargs['stdin'] = PIPE
    
    if capture_output:
        if ('stdout' in kwargs) or ('stderr' in kwargs):
            raise ValueError('stdout and stderr arguments may not be used '
                             'with capture_output.')
        kwargs['stdout'] = PIPE
        kwargs['stderr'] = PIPE
    
    with Popen(*popenargs, **kwargs) as process:
        try:
            stdout, stderr = process.communicate(input, timeout=timeout)
        except TimeoutExpired:
            process.kill()
            stdout, stderr = process.communicate()
            raise TimeoutExpired(process.args, timeout, output=stdout,
                                 stderr=stderr)
        except:  # Including KeyboardInterrupt, communicate handled that.
            process.kill()
            # We don't call process.wait() as .__exit__ does that for us.
            raise
        retcode = process.poll()
        if check and retcode:
            raise CalledProcessError(retcode, process.args,
                                     output=stdout, stderr=stderr)
    return CompletedProcess(process.args, retcode, stdout, stderr)
Nach dem Login kopieren

Vor Python3.5 bildeten die drei Methoden call(), check_all() und checkoutput() die High-Level-API des Unterprozessmoduls.

subprocess.call()

Führen Sie den Befehl aus, warten Sie, bis die durch den args-Parameter angegebene Anweisung abgeschlossen ist, und geben Sie den Ausführungsstatuscode zurück (Returncode-Attribut der Popen-Instanz).

Parameter: (*popenargs, timeout=None, **kwargs). Im Wesentlichen identisch mit den Popen-Konstruktorparametern, alle Parameter außer Timeout werden an die Popen-Schnittstelle übergeben.

Verwenden Sie nicht stdout=PIPE oder stderr=PIPE, wenn Sie die Funktion call() aufrufen, denn wenn der untergeordnete Prozess genügend Ausgabe an die Pipe generiert, um den Pipe-Puffer des Betriebssystems zu füllen, kann der untergeordnete Prozess nicht lesen Daten aus der Leitung und Verstopfungen verursachen.

# 源码

def call(*popenargs, timeout=None, **kwargs):
    with Popen(*popenargs, **kwargs) as p:
        try:
            return p.wait(timeout=timeout)
        except:
            p.kill()
            p.wait()
            raise
Nach dem Login kopieren

subprocess.check_call()

Führen Sie aus und warten Sie, bis die durch den Parameter args angegebene Anweisung abgeschlossen ist, geben Sie einen 0-Statuscode zurück oder lösen Sie eine CalledProcessError-Ausnahme aus. Die cmd- und returncode-Attribute des Ausnahme kann die Ausführungsausnahmeanweisungen und Statuscodes anzeigen.

Parameter: (*popenargs, **kwargs). Alle Parameter werden an die Funktion call() übergeben.

Hinweise sind die gleichen wie call()

# 源码

def check_call(*popenargs, **kwargs):
    retcode = call(*popenargs, **kwargs)
    if retcode:
        cmd = kwargs.get("args")
        if cmd is None:
            cmd = popenargs[0]
        raise CalledProcessError(retcode, cmd)
    return 0
Nach dem Login kopieren

subprocess.check_output()

Führen Sie den Befehl aus und warten Sie, bis die durch den args-Parameter angegebene Anweisung abgeschlossen ist, und kehren Sie zum Standard zurück Ausgabe (Standardausgabe-Attribut der CompletedProcess-Instanz), der Typ ist standardmäßig Byte. Die Byte-Kodierung kann von der ausgeführten Anweisung abhängen. Die Einstellung universal_newlines=True kann einen Wert vom Typ string zurückgeben.
Wenn der Ausführungsstatuscode nicht 0 ist, wird eine CalledProcessError-Ausnahme ausgelöst.

Parameter: (*popenargs, timeout=None, **kwargs). Alle Argumente werden an die Funktion run() übergeben, aber die explizite Übergabe von input=None zum Erben des Standard-Eingabedateihandles des übergeordneten Prozesses wird nicht unterstützt.

Um Standardfehler im Rückgabewert zu erfassen, legen Sie stderr=subprocess.STDOUT fest. Sie können Standardfehler auch an die Pipe stderr=subprocess.PIPE umleiten, auf die über das stderr-Attribut der CalledProcessError-Ausnahme zugegriffen wird.

# 源码

def check_output(*popenargs, timeout=None, **kwargs):
    if 'stdout' in kwargs:
        raise ValueError('stdout argument not allowed, it will be overridden.')

    if 'input' in kwargs and kwargs['input'] is None:
        # Explicitly passing input=None was previously equivalent to passing an
        # empty string. That is maintained here for backwards compatibility.
        kwargs['input'] = '' if kwargs.get('universal_newlines', False) else b''

    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
               **kwargs).stdout
Nach dem Login kopieren

Das Unterprozessmodul bietet auch verwandte Funktionen des Befehlsmoduls in der Python2.x-Version.

subprocess.getstatusoutput(cmd)

ruft tatsächlich die Funktion check_output() auf, führt die cmd-Anweisung vom Typ String in der Shell aus und gibt ein Tupel in der Form (Exitcode, Ausgabe) zurück. Ausgabe( (einschließlich stderr und stdout) ist eine Zeichenfolge, die mithilfe der Locale-Kodierung dekodiert wurde, wobei die abschließende neue Zeile entfernt wurde.

# 源码

try:
    data = check_output(cmd, shell=True, universal_newlines=True, stderr=STDOUT)
    exitcode = 0
except CalledProcessError as ex:
    data = ex.output
    exitcode = ex.returncode
if data[-1:] == '\n':
    data = data[:-1]
return exitcode, data
Nach dem Login kopieren

subprocess.getoutput(cmd)

Ähnlich wie getstatusoutput(), aber das Ergebnis gibt nur eine Ausgabe zurück.

Dieser Artikel ist hier zu Ende. Weitere spannende Inhalte finden Sie in der Spalte Python-Video-Tutorial auf der chinesischen PHP-Website!

Das obige ist der detaillierte Inhalt vonEinführung in Methoden auf Unterprozessmodulebene in Python (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage