Heim > Artikel > Backend-Entwicklung > Einführung und Verwendung des Unterprozessmoduls
1. Unterprozess und häufig verwendete Kapselungsfunktionen
Beim Ausführen von Python erstellen und führen wir einen Prozess aus. Wie ein Linux-Prozess kann ein Prozess einen untergeordneten Prozess forken und den untergeordneten Prozess ein anderes Programm ausführen lassen. In Python verwenden wir das Unterprozesspaket in der Standardbibliothek, um einen Unterprozess zu forken und ein externes Programm auszuführen.
Das Unterprozesspaket definiert mehrere Funktionen zum Erstellen von Unterprozessen. Diese Funktionen erstellen Unterprozesse auf unterschiedliche Weise, sodass wir je nach Bedarf einen davon auswählen können. Darüber hinaus bietet Subprocess auch einige Tools zum Verwalten von Standard-Streams und -Pipes, um die Textkommunikation zwischen Prozessen zu nutzen.
subprocess.call()
Der übergeordnete Prozess wartet auf den Abschluss des untergeordneten Prozesses
Exit-Informationen zurückgeben (Rückgabecode, entspricht dem Linux-Exit-Code)
subprocess.check_call()
Übergeordneter Prozess wartet auf den Abschluss des Unterprozesses
Return 0
Überprüfen Sie die Exit-Informationen. Wenn der Returncode nicht 0 ist, wird der Fehler subprocess.CalledProcessError ausgelöst. Sie können try verwenden ...außer... zur Prüfung
subprocess.check_output()
Der übergeordnete Prozess wartet auf den Abschluss des untergeordneten Prozesses
Gibt das Ausgabeergebnis des untergeordneten Prozesses an die Standardausgabe zurück
Überprüfen Sie die Exit-Informationen. Wenn der Returncode nicht 0 ist, wird der Fehler subprocess.CalledProcessError ausgelöst. Dieses Objekt enthält das Returncode-Attribut und das Ausgabeattribut. Das Ausgabeattribut ist das Ausgabeergebnis der Standardausgabe und kann mit try überprüft werden. außer....
Der Unterprozess wurde erstmals in Version 2.4 eingeführt. Wird verwendet, um untergeordnete Prozesse zu erzeugen, ihre Eingaben/Ausgaben/Fehler über Pipes zu verbinden und ihre Rückgabewerte zu erhalten.
Unterprozess wird verwendet, um mehrere alte Module und Funktionen zu ersetzen:
os.system
os.spawn*
os.popen*
popen2.*
Befehle.*
Beim Ausführen von Python haben wir Sie alle erstellen und führen einen Prozess aus. Unter Linux kann ein Prozess einen untergeordneten Prozess verzweigen und den untergeordneten Prozess ein anderes Programm ausführen lassen. In Python verwenden wir das Unterprozesspaket in der Standardbibliothek, um einen Unterprozess zu forken und ein externes Programm auszuführen. Das Unterprozesspaket definiert mehrere Funktionen zum Erstellen von Unterprozessen. Diese Funktionen erstellen Unterprozesse auf unterschiedliche Weise, sodass wir je nach Bedarf einen davon auswählen können. Darüber hinaus bietet Subprocess auch einige Tools zum Verwalten von Standard-Streams und -Pipes, um die Textkommunikation zwischen Prozessen zu nutzen.
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 表示执行错误
Führen Sie den Befehl des Betriebssystems aus und das Ergebnis wird im Speicher gespeichert, der mit der Methode read() ausgelesen werden kann
import os >>> res = os.popen("ls -l") # 将结果保存到内存中 >>> print res <open file 'ls -l', mode 'r' 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
>>> 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=['df', '-h'], returncode=0) # 需要交给Linux shell自己解析,则:传入命令字符串,shell=True >>> subprocess.run("df -h|grep /dev/sda1",shell=True) /dev/sda1 283M 27M 241M 11% /boot CompletedProcess(args='df -h|grep /dev/sda1', returncode=0)
🎜>
2. subprocess.call()Führen Sie den Befehl aus und geben Sie das Ergebnis und den Ausführungsstatus des Befehls zurück, 0 oder nicht 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
>>> 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
Akzeptiert Befehle in Form von Zeichenfolgen und gibt sie zurück ein Ergebnis in Form eines Tupels. Das erste Element ist der Befehlsausführungsstatus und das zweite ist das Ausführungsergebnis
#执行正确 >>> subprocess.getstatusoutput('pwd') (0, '/root') #执行错误 >>> subprocess.getstatusoutput('pd') (127, '/bin/sh: pd: command not found')
akzeptiert Befehle in Stringform und gibt das Ausführungsergebnis zurück
>>> subprocess.getoutput('pwd') '/root'
>>> res = subprocess.check_output("pwd") >>> res b'/root\n' # 结果以字节形式返回
Tatsächlich wird die obige Methode von subprocess verwendet und ist alles eine Kapselung von subprocess.Popen. Schauen wir uns diese Popen-Methode an.
Standardausgabe
>>> res = subprocess.Popen("ls /tmp/yum.log", shell=True, stdout=subprocess.PIPE) # 使用管道 >>> res.stdout.read() # 标准输出 b'/tmp/yum.log\n' res.stdout.close() # 关闭
>>> import subprocess >>> res = subprocess.Popen("lm -l",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) # 标准输出为空 >>> res.stdout.read() b'' #标准错误中有错误信息 >>> res.stderr.read() b'/bin/sh: lm: command not found\n'
注意:上面的提到的标准输出都为啥都需要等于subprocess.PIPE,这个又是啥呢?原来这个是一个管道,这个需要画一个图来解释一下:
定时检查命令有没有执行完毕,执行完毕后返回执行结果的状态,没有执行完毕返回None
>>> res = subprocess.Popen("sleep 10;echo 'hello'",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) >>> print(res.poll()) None >>> print(res.poll()) None >>> print(res.poll()) 0
等待命令执行完成,并且返回结果状态
>>> obj = subprocess.Popen("sleep 10;echo 'hello'",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) >>> obj.wait() # 中间会一直等待 0
结束进程
import subprocess >>> res = subprocess.Popen("sleep 20;echo 'hello'",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) >>> res.terminate() # 结束进程 >>> res.stdout.read() b''
获取当前执行子shell的程序的进程号
import subprocess >>> res = subprocess.Popen("sleep 5;echo 'hello'",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) >>> res.pid # 获取这个linux shell 的 进程号 2778
Das obige ist der detaillierte Inhalt vonEinführung und Verwendung des Unterprozessmoduls. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!