[Python2.7] Résumé de l'utilisation du sous-processus

Aperçu

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

Spécification d'importation

import


import subprocess

API de base

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

Obtenir une erreur standard lors de l'utilisation de subprocess.check_output

Spécifiez stderr = subprocess.STDOUT comme suit.

Exemple d'utilisation


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

Changer le répertoire d'exécution du sous-processus

Utilisation de l'option 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

point important

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é.

Supplément: Attaque par injection de commande / injection d'obus

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

Comportement inconnu

-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)

référence

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

[Python2.7] Résumé de l'utilisation du sous-processus
[Python] Résumé de l'utilisation des pandas
[Python2.7] Résumé de l'utilisation d'unittest
Résumé de l'utilisation de la liste Python
Résumé de l'utilisation de MNIST avec Python
Résumé de l'utilisation de pandas.DataFrame.loc
Résumé de l'utilisation de pyenv-virtualenv
Résumé de l'utilisation de csvkit
[Question] Comment utiliser plot_surface de python
[Python] Résumé de l'utilisation des fonctions de fractionnement et de jointure
[Python] Comment utiliser deux types de type ()
python3: Comment utiliser la bouteille (2)
[Python] Comment utiliser la liste 1
Python: comment utiliser pydub
[Python] Comment utiliser checkio
Résumé de l'étude de Python pour utiliser AWS Lambda
[Python] Comment utiliser input ()
Comment utiliser Python lambda
[Python] Comment utiliser virtualenv
python3: Comment utiliser la bouteille (3)
python3: Comment utiliser la bouteille
Comment utiliser les octets Python
J'ai essayé de résumer comment utiliser matplotlib de python
Comment utiliser Python Kivy ① ~ Bases du langage Kv ~
[Python] Résumé de la façon de spécifier la couleur de la figure
Python: comment utiliser async avec
[Python] Comment utiliser la série Pandas
Comment utiliser Mysql avec python
Comment utiliser l'API Python d'OpenPose
Comment utiliser ChemSpider en Python
Comment utiliser PubChem avec Python
Comment utiliser la fonction zip de python
[Python] Comment utiliser l'API Typetalk
[python] Résumé de la récupération des listes et des éléments du dictionnaire
Comparaison de l'utilisation des fonctions d'ordre supérieur dans Python 2 et 3
[Introduction à Python] Comment utiliser la classe en Python?
scikit-learn Comment utiliser le résumé (apprentissage automatique)
Comment installer et utiliser pandas_datareader [Python]
[python] Comment utiliser __command__, explication des fonctions
Comment calculer Utiliser% de la commande df
[Python] Comment utiliser import sys sys.argv
Mémorandum sur l'utilisation du python gremlin
python: Comment utiliser les locals () et globals ()
Comment utiliser __slots__ dans la classe Python
Jupyter Notebook Principes d'utilisation
Comment utiliser "deque" pour les données Python
Bases de PyTorch (1) -Comment utiliser Tensor-
Comment utiliser le zip Python et énumérer
Comment utiliser les expressions régulières en Python
Comment utiliser is et == en Python
Résumé de l'écriture d'AWS Lambda
Comment utiliser Python Kivy (référence) -J'ai traduit le langage Kivy de la référence API-
Grammaire de base du système Python3 (comment utiliser les fonctions, la fermeture, la fonction lambda)
Comment utiliser xml.etree.ElementTree
Comment utiliser Python-shell
Remarques sur l'utilisation de tf.data
Comment utiliser virtualenv
Comment utiliser Seaboan
Comment utiliser la correspondance d'image