Maison >développement back-end >Tutoriel Python >Introduction et utilisation du module de sous-processus

Introduction et utilisation du module de sous-processus

零下一度
零下一度original
2017-07-23 13:46:449562parcourir

1. sous-processus et fonctions d'encapsulation couramment utilisées
Lors de l'exécution de Python, nous créons et exécutons un processus. Comme un processus Linux, un processus peut créer un processus enfant et laisser ce processus enfant exécuter un autre programme. En Python, nous utilisons le package de sous-processus dans la bibliothèque standard pour créer un sous-processus et exécuter un programme externe.
Le package de sous-processus définit plusieurs fonctions pour créer des sous-processus. Ces fonctions créent des sous-processus de différentes manières, nous pouvons donc en choisir une à utiliser en fonction de nos besoins. De plus, le sous-processus fournit également des outils pour gérer les flux et canaux standard afin d'utiliser la communication textuelle entre les processus.

subprocess.call()
Le processus parent attend que le processus enfant se termine
Renvoyer les informations de sortie (code de retour, équivalent au code de sortie Linux)

subprocess.check_call()
Parent Le processus attend la fin du sous-processus
Return 0
Vérifiez les informations de sortie. Si le code de retour n'est pas 0, déclenchez l'erreur subprocess.CalledProcessError Cet objet contient l'attribut returncode. ...sauf... pour vérifier

subprocess.check_output()
Le processus parent attend la fin du processus enfant
Renvoie le résultat de sortie du processus enfant à la sortie standard
Vérifiez les informations de sortie, si le code de retour n'est pas 0, déclenchez le sous-processus d'erreur.CalledProcessError, cet objet contient l'attribut returncode et l'attribut de sortie. L'attribut de sortie est le résultat de la sortie standard et peut être vérifié avec try.. .sauf....

1. Introduction

Le sous-processus a été introduit pour la première fois dans la version 2.4. Utilisé pour générer des processus enfants, connecter leurs entrées/sorties/erreurs via des tuyaux et obtenir leurs valeurs de retour.

Le sous-processus est utilisé pour remplacer plusieurs anciens modules et fonctions :

  • os.system

  • os.spawn*

  • os.popen*

  • popen2.*

  • commands.*

Lors de l'exécution de Python, nous Ils créent et exécutent tous un processus. Sous Linux, un processus peut créer un processus enfant et laisser ce processus enfant exécuter un autre programme. En python, nous utilisons le package de sous-processus dans la bibliothèque standard pour créer un sous-processus et exécuter un programme externe. Le package de sous-processus définit plusieurs fonctions pour créer des sous-processus. Ces fonctions créent des sous-processus de différentes manières, nous pouvons donc en choisir une à utiliser en fonction de nos besoins. De plus, le sous-processus fournit également des outils pour gérer les flux et canaux standard afin d'utiliser la communication textuelle entre les processus.

2. Utilisation d'anciens modules

1.os.system()

Exécuter les commandes du système d'exploitation, afficher le résultats à l'écran et renvoie uniquement l'état d'exécution de la commande (0 : succès, non-0 : échec)

import os

>>> a = os.system("df -Th")
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/sda3      ext4   1.8T  436G  1.3T  26% /
tmpfs          tmpfs   16G     0   16G   0% /dev/shm
/dev/sda1      ext4   190M  118M   63M  66% /boot

>>> a
0         # 0 表示执行成功


# 执行错误的命令
>>> res = os.system("list")
sh: list: command not found
>>> res
32512       # 返回非 0 表示执行错误

 

os.popen().

Exécutez la commande du système d'exploitation et le résultat sera enregistré dans la mémoire, qui peut être lu à l'aide de la méthode read()

import os

>>> res = os.popen("ls -l")

# 将结果保存到内存中
>>> print res
<open file &#39;ls -l&#39;, mode &#39;r&#39; at 0x7f02d249c390>

# 用read()读取内容
>>> print res.read()
total 267508
-rw-r--r--  1 root root    260968 Jan 27  2016 AliIM.exe
-rw-------. 1 root root      1047 May 23  2016 anaconda-ks.cfg
-rw-r--r--  1 root root   9130958 Nov 18  2015 apache-tomcat-8.0.28.tar.gz
-rw-r--r--  1 root root         0 Oct 31  2016 badblocks.log
drwxr-xr-x  5 root root      4096 Jul 27  2016 certs-build
drwxr-xr-x  2 root root      4096 Jul  5 16:54 Desktop
-rw-r--r--  1 root root      2462 Apr 20 11:50 Face_24px.ico

 

3. module de sous-processus

1. subprocess.run()

>>> import subprocess
# python 解析则传入命令的每个参数的列表
>>> subprocess.run(["df","-h"])
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-LogVol00
                      289G   70G  204G  26% /
tmpfs                  64G     0   64G   0% /dev/shm
/dev/sda1             283M   27M  241M  11% /boot
CompletedProcess(args=[&#39;df&#39;, &#39;-h&#39;], returncode=0)

# 需要交给Linux shell自己解析,则:传入命令字符串,shell=True
>>> subprocess.run("df -h|grep /dev/sda1",shell=True)
/dev/sda1             283M   27M  241M  11% /boot
CompletedProcess(args=&#39;df -h|grep /dev/sda1&#39;, returncode=0)

 🎜>

2. subprocess.call()

Exécuter la commande et renvoyer le résultat et l'état d'exécution de la commande, 0 ou non-0

>>> res = subprocess.call(["ls","-l"])
总用量 28
-rw-r--r--  1 root root     0 6月  16 10:28 1
drwxr-xr-x  2 root root  4096 6月  22 17:48 _1748
-rw-------. 1 root root  1264 4月  28 20:51 anaconda-ks.cfg
drwxr-xr-x  2 root root  4096 5月  25 14:45 monitor
-rw-r--r--  1 root root 13160 5月   9 13:36 npm-debug.log

# 命令执行状态
>>> res
0
 

3. subprocess.check_call()

Exécutez la commande et renvoyez le résultat et le statut Normalement, il est 0. S'il y a une erreur d'exécution, un. une exception sera levée

>>> subprocess.check_call(["ls","-l"])
总用量 28
-rw-r--r--  1 root root     0 6月  16 10:28 1
drwxr-xr-x  2 root root  4096 6月  22 17:48 _1748
-rw-------. 1 root root  1264 4月  28 20:51 anaconda-ks.cfg
drwxr-xr-x  2 root root  4096 5月  25 14:45 monitor
-rw-r--r--  1 root root 13160 5月   9 13:36 npm-debug.log
0

>>> subprocess.check_call(["lm","-l"])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/subprocess.py", line 537, in check_call
    retcode = call(*popenargs, **kwargs)
  File "/usr/lib64/python2.7/subprocess.py", line 524, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

4. subprocess.getstatusoutput()

Accepte les commandes sous forme de chaînes et renvoie un résultat sous la forme d'un tuple Le premier élément est l'état d'exécution de la commande, et le second est le résultat de l'exécution

#执行正确
>>> subprocess.getstatusoutput(&#39;pwd&#39;)
(0, &#39;/root&#39;)

#执行错误
>>> subprocess.getstatusoutput(&#39;pd&#39;)
(127, &#39;/bin/sh: pd: command not found&#39;)
 

5. subprocess.getoutput()

accepte les commandes sous forme de chaîne et met Retour du résultat de l'exécution

>>> subprocess.getoutput(&#39;pwd&#39;)
&#39;/root&#39;
 

6. subprocess.check_output()

Exécutez la commande et renvoyez le résultat de l'exécution au lieu de Print

>>> res = subprocess.check_output("pwd")
>>> res
b&#39;/root\n&#39; # 结果以字节形式返回
 

4. sous-processus. Popen()

En fait, la méthode ci-dessus est utilisée par subprocess , sont toutes des encapsulations de subprocess.Popen Jetons un coup d'œil à cette méthode Popen.

1.stdout

Stdout

>>> res = subprocess.Popen("ls /tmp/yum.log", shell=True, stdout=subprocess.PIPE)  # 使用管道
>>> res.stdout.read()    # 标准输出
b&#39;/tmp/yum.log\n&#39;

res.stdout.close()   # 关闭

 

2. stderr

Erreur standard

>>> import subprocess
>>> res = subprocess.Popen("lm -l",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
# 标准输出为空
>>> res.stdout.read()
b&#39;&#39;

#标准错误中有错误信息
>>> res.stderr.read()
b&#39;/bin/sh: lm: command not found\n&#39;

  

注意:上面的提到的标准输出都为啥都需要等于subprocess.PIPE,这个又是啥呢?原来这个是一个管道,这个需要画一个图来解释一下:

4、poll()

定时检查命令有没有执行完毕,执行完毕后返回执行结果的状态,没有执行完毕返回None

>>> res = subprocess.Popen("sleep 10;echo &#39;hello&#39;",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> print(res.poll())
None
>>> print(res.poll())
None
>>> print(res.poll())
0

  

5、wait()

等待命令执行完成,并且返回结果状态

>>> obj = subprocess.Popen("sleep 10;echo &#39;hello&#39;",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> obj.wait()


# 中间会一直等待


0

  

6、terminate()

结束进程

import subprocess

>>> res = subprocess.Popen("sleep 20;echo &#39;hello&#39;",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> res.terminate()  # 结束进程
>>> res.stdout.read() 
b&#39;&#39;

7、pid

获取当前执行子shell的程序的进程号

import subprocess

>>> res = subprocess.Popen("sleep 5;echo &#39;hello&#39;",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> res.pid  # 获取这个linux shell 的 进程号
2778

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn