[Python2.7] Zusammenfassung der Verwendung des Unterprozesses

Überblick

Es gibt ziemlich viele Möglichkeiten, Teilprozesse zu verwenden, daher werde ich die Punkte, die ich untersucht habe, ohne Verständnis zusammenfassen. Dieser Artikel ist für "Python 2.7", da ich zum Zeitpunkt meiner Recherche die "Python 2.7" -Umgebung als Anwendungsfall angenommen habe.

Grundsätzlich beziehen Sie sich bitte auf das offizielle Dokument unten. 17.1. Unterprozess - Unterprozessverwaltung - Python 2.7.x-Dokumentation

Insbesondere im Fall von Python 3.5 oder höher ist die Verwendung unterschiedlich, da der allgemeine Befehl run () hinzugefügt wird. Bitte beziehen Sie sich auf die Formel ohne Umleitung, wie sie ist. 17.5. Unterprozess - Unterprozessverwaltung - Python 3.5.2-Dokumentation

Importspezifikation

import


import subprocess

Grundlegende API

subprocess.call -Standardausgabe / Standardfehler zum Zeitpunkt der Ausführung wird zum Zeitpunkt der Ausführung ausgegeben ・ Gibt einen Rückkehrcode sowohl unter normalen als auch unter abnormalen Bedingungen zurück

Ausführungsbeispiel


import subprocess

print '!!! start'

cmd = 'echo aaa'
retcode = subprocess.call(cmd.split())
print retcode

cmd = 'false'
retcode = subprocess.call(cmd.split())
print retcode

print '!!! end'

Ausgabe


aaa
!!! start
0
1
!!! end

subprocess.check_call -Standardausgabe / Standardfehler zum Zeitpunkt der Ausführung wird zum Zeitpunkt der Ausführung ausgegeben ・ Gibt im Normalfall 0 Rückkehrcode zurück ・ Wenn ein Fehler auftritt, wird die Ausnahme subprocess.CalledProcessError gesendet.

Ausführungsbeispiel


import subprocess

print '!!! start'

cmd = 'echo aaa'
retcode = subprocess.check_call(cmd.split())
print retcode

cmd = 'false'
try:
    retcode = subprocess.check_call(cmd.split())
except subprocess.CalledProcessError as e:
    print e.returncode
    print e.cmd
    print e.output

print '!!! end'

Ausgabe


aaa
!!! start
0
1
['false']
None
!!! end

subprocess.check_output -Standardausgabe / Standardfehler zum Zeitpunkt der Ausführung wird zum Zeitpunkt der Ausführung ausgegeben ・ Gibt bei normaler Ausgabe die Standardausgabe zurück ・ Wenn ein Fehler auftritt, wird die Ausnahme subprocess.CalledProcessError gesendet.

Ausführungsbeispiel


import subprocess

print '!!! start'

cmd = 'echo aaa'
d = subprocess.check_output(cmd.split())
print d,

cmd = 'unexist_command'
try:
    d = subprocess.check_output(
            cmd.split(),
            stderr=subprocess.STDOUT,
            shell=True)
    print d,
except subprocess.CalledProcessError as e:
    print e.returncode
    print e.cmd
    print e.output,

print '!!! end'

Ausgabe


!!! start
aaa
127
['unexist_command']
/bin/sh: unexist_command: command not found
!!! end

Bei Verwendung von subprocess.check_output wird ein Standardfehler angezeigt

Geben Sie "stderr = subprocess.STDOUT" wie folgt an.

Anwendungsbeispiel


    d = subprocess.check_output(
            cmd.split(),
            stderr=subprocess.STDOUT,
            shell=True)

Ändern Sie das Ausführungsverzeichnis des Unterprozesses

Verwenden Sie die Option "cwd"

Angabe des Ausführungsverzeichnisses


subprocess.call(cmd, cwd=workdir)

Ein Ausführungsbeispiel ist unten gezeigt.

Ausführungsbeispiel


import subprocess

d1 = subprocess.check_output(['pwd'])                   #Ausgangsposition/tmp
d2 = subprocess.check_output(['pwd'], cwd='/tmp/hoge')  #Bestätigung mit absolutem Pfad
d3 = subprocess.check_output(['pwd'])                   #Nicht von anderen Bewegungen betroffen
d4 = subprocess.check_output(['pwd'], cwd='./hoge')     #Bestätigung mit relativem Pfad

print 'case 1:'
print d1,
print d2,

print 'case 2:'
print d3,
print d4,

Ausführungsbeispiel


case 1:
/tmp
/tmp/hoge
case 2:
/tmp
/tmp/hoge

python subprocess changing directory - Stack Overflow

wichtiger Punkt

Wenn Sie Ausführungsbefehle von außen abrufen, insbesondere wenn "shell = True" angegeben ist, kann ein Befehlsinjektionsangriff auftreten. Achten Sie daher auf die Sicherheit.

Ergänzung: Command Injection Attack / Shell Injection

IPA ISEC Secure Programming-Kurs: Webanwendung Kapitel 6 Gegenmaßnahmen bei der Eingabe: Gegenmaßnahmen bei Befehlsinjektionsangriffen Code injection - Wikipedia

Unbekanntes Verhalten

-Wenn in "check_output" "shell = True" angegeben ist, wird möglicherweise keine Standardausgabe / kein Standardfehler erhalten. (Leere Zeichenfolge wird zurückgegeben)

Referenz

Verwenden Sie communic (), wenn Sie eine Ausgabe in Python subprocess-Qiita empfangen Um einen Befehl mit Python auszuführen - mit einem Becher!

Recommended Posts

[Python2.7] Zusammenfassung der Verwendung des Unterprozesses
[Python] Zusammenfassung der Verwendung von Pandas
[Python2.7] Zusammenfassung der Verwendung von unittest
Zusammenfassung der Verwendung der Python-Liste
Zusammenfassung der Verwendung von MNIST mit Python
Zusammenfassung der Verwendung von pandas.DataFrame.loc
Zusammenfassung der Verwendung von pyenv-virtualenv
Zusammenfassung der Verwendung von csvkit
[Frage] Wie verwende ich plot_surface von Python?
[Python] Zusammenfassung der Verwendung von Split- und Join-Funktionen
[Python] Verwendung von zwei Arten von type ()
python3: Verwendung der Flasche (2)
[Python] Verwendung von Liste 1
Python: Wie man pydub benutzt
[Python] Verwendung von checkio
Zusammenfassung des Studiums von Python zur Verwendung von AWS Lambda
[Python] Verwendung von input ()
Wie benutzt man Python Lambda?
[Python] Verwendung von virtualenv
python3: Verwendung der Flasche (3)
python3: Wie man eine Flasche benutzt
Verwendung von Python-Bytes
Ich habe versucht zusammenzufassen, wie man Matplotlib von Python verwendet
Verwendung von Python Kivy ~ ~ Grundlagen der Kv-Sprache ~
[Python] Zusammenfassung, wie die Farbe der Figur angegeben wird
Python: So verwenden Sie Async mit
[Python] Verwendung der Pandas-Serie
Wie man MySQL mit Python benutzt
Verwendung der Python-API von OpenPose
Verwendung von ChemSpider in Python
Verwendung von PubChem mit Python
Verwendung der Zip-Funktion von Python
[Python] Verwendung der Typetalk-API
[Python] Zusammenfassung zum Abrufen von Listen und Wörterbuchelementen
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3
[Einführung in Python] Wie verwende ich eine Klasse in Python?
scikit-learn Verwendung der Zusammenfassung (maschinelles Lernen)
So installieren und verwenden Sie pandas_datareader [Python]
[Python] Verwendung von __command__, Funktionserklärung
Berechnen Verwenden Sie% des Befehls df
[Python] Verwendung von import sys sys.argv
Memorandum über die Verwendung von Gremlin Python
Python: Verwendung von Einheimischen () und Globalen ()
Verwendung von __slots__ in der Python-Klasse
Jupyter Notebook Grundlagen der Verwendung
Verwendung von "deque" für Python-Daten
Grundlagen von PyTorch (1) - Verwendung von Tensor-
Verwendung von Python zip und Aufzählung
Verwendung regulärer Ausdrücke in Python
Verwendung ist und == in Python
Zusammenfassung des Schreibens von AWS Lambda
Verwendung von Python Kivy (Referenz) -Ich habe die Kivy-Sprache der API-Referenz übersetzt-
Grundlegende Grammatik des Python3-Systems (Verwendung von Funktionen, Schließung, Lambda-Funktion)
Verwendung von xml.etree.ElementTree
Wie benutzt man Python-Shell
Hinweise zur Verwendung von tf.data
Verwendung von virtualenv
Wie benutzt man Seaboan?
Verwendung von Image-Match