Il existe de nombreuses possibilités d'utiliser le sous-processus, je vais donc résumer les points que j'ai étudiés sans comprendre.
Cet article est pour Python 2.7
parce que j'ai supposé l'environnement Python 2.7
comme mon cas d'utilisation au moment de mes recherches.
En gros, veuillez vous référer au document officiel ci-dessous. 17.1. Sous-processus - Gestion des sous-processus - Documentation Python 2.7.x
Surtout dans le cas de Python 3.5 ou supérieur, l'utilisation est différente car la commande run ()
à usage général est ajoutée.
Veuillez vous référer à la formule sans détournement telle quelle.
17.5. Sous-processus - Gestion des sous-processus - Documentation Python 3.5.2
import
import subprocess
subprocess.call -La sortie standard / erreur standard au moment de l'exécution est sortie au moment de l'exécution ・ Renvoie un code de retour dans des conditions normales et anormales
Échantillon d'exécution
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'
production
aaa
!!! start
0
1
!!! end
subprocess.check_call
-La sortie standard / erreur standard au moment de l'exécution est sortie au moment de l'exécution
・ Renvoie 0 code retour lorsqu'il est normal
・ Lorsqu'une erreur se produit, exception subprocess.CalledProcessError
est envoyée.
Échantillon d'exécution
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'
production
aaa
!!! start
0
1
['false']
None
!!! end
subprocess.check_output
-La sortie standard / erreur standard au moment de l'exécution est sortie au moment de l'exécution
・ Renvoie la sortie standard lorsqu'elle est normale
・ Lorsqu'une erreur se produit, exception subprocess.CalledProcessError
est envoyée.
Échantillon d'exécution
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'
production
!!! start
aaa
127
['unexist_command']
/bin/sh: unexist_command: command not found
!!! end
subprocess.check_output
Spécifiez stderr = subprocess.STDOUT
comme suit.
Exemple d'utilisation
d = subprocess.check_output(
cmd.split(),
stderr=subprocess.STDOUT,
shell=True)
cwd
Spécification du répertoire d'exécution
subprocess.call(cmd, cwd=workdir)
Un exemple d'exécution est présenté ci-dessous.
Échantillon d'exécution
import subprocess
d1 = subprocess.check_output(['pwd']) #Position initiale/tmp
d2 = subprocess.check_output(['pwd'], cwd='/tmp/hoge') #Confirmation avec chemin absolu
d3 = subprocess.check_output(['pwd']) #Non affecté par d'autres mouvements
d4 = subprocess.check_output(['pwd'], cwd='./hoge') #Confirmation avec chemin relatif
print 'case 1:'
print d1,
print d2,
print 'case 2:'
print d3,
print d4,
Exemple d'exécution
case 1:
/tmp
/tmp/hoge
case 2:
/tmp
/tmp/hoge
python subprocess changing directory - Stack Overflow
Lorsque vous récupérez une commande d'exécution de l'extérieur, en particulier lorsque shell = True
est spécifié, une attaque par injection de commande peut se produire, alors faites attention à la sécurité.
Cours de programmation sécurisée IPA ISEC: Application Web Chapitre 6 Contre-mesures d'entrée: contre-mesures d'attaque par injection de commande Code injection - Wikipedia
-Lorsque shell = True
est spécifié dans check_output
, la sortie standard / erreur standard peut ne pas être obtenue. (Une chaîne de caractères vide est renvoyée)
Utilisez communiquer () lors de la réception de la sortie dans Python subprocess-Qiita Pour exécuter une commande avec python-avec une tasse!
Recommended Posts