抽空了解了一下python的subprocess包,簡單記下學習記錄。subprocess是python中的乙個子程序包,可以在執行python的時候開啟乙個子程序來執行另乙個外部程式。通過該包的功能,可以呼叫一些shell命令以對作業系統簡單操作。
subprocess定義了數個以不同方式建立子程序的函式,這裡只簡單記錄一下。
subprocess.call(),通過此函式建立子程序後,父程序會等待子程序執行完成,並返回退出資訊(returncode);
subprocess.popen(), 通過此函式建立的子程序,父程序並不會等待子程序完成,除非子程序呼叫child.wait()方法。
# coding:utf-8
import subprocess
rc = subprocess.call(["ls", "-l"])
# print(rc)
print("aaa")
# 通過shell執行
out = subprocess.popen("ls -l", shell=true)
# print out
print("test")
# total 24
# -rw-r--r-- 1 linshaokang staff 15 jan 6 12:55 __init__.py
# -rw-r--r-- 1 linshaokang staff 187 jan 16 12:27 test1.py
# -rw-r--r-- 1 linshaokang staff 769 jan 6 13:18 test2.py
## aaa 父程序的字串輸出一直等待子程序完成後才輸出##
# test 同樣的執行順序,父程序並未等待子程序完成,直接輸出test
## total 24
# -rw-r--r-- 1 linshaokang staff 15 jan 6 12:55 __init__.py
# -rw-r--r-- 1 linshaokang staff 187 jan 16 12:27 test1.py
# -rw-r--r-- 1 linshaokang staff 769 jan 6 13:18 test2.py
其中call(),當然還有check_call(), check_output()函式其實是在popen()上的一層封裝,這些封裝的目的只是方便簡化我們使用子程序,如果有定製化的需求,可以使用popen()函式。
子程序的文字流控制
child.stdin, child.stdout, child.stderr
在使用popen建立子程序時,可以通過subprocess.pipe將多個子程序連線起來組成乙個管道以實現通訊。
# coding:utf-8
import subprocess
child1 = subprocess.popen(["ls", "-l"], stdout=subprocess.pipe)
child2 = subprocess.popen(["wc", "-l"], stdin=child1.stdout, stdout=subprocess.pipe)
out = child2.stdout.read()
# out = child2.communicate()
print(out)
# subprocess.pipe實際上為文字流提供乙個快取區。child1的stdout將文字輸出到快取區,隨後child2的stdin從該pipe中將文字讀取走。
# child2的輸出文字也被存放在pipe中,直到communicate()方法從pipe中讀取出pipe中的文字。
## 要注意的是,communicate()是popen物件的乙個方法,該方法會阻塞父程序,直到子程序完成。
child = subprocess.popen(["cat"], stdin=subprocess.pipe)
child.stdin.write("test1.py")
# child.communicate("test1.py")
# --------result-------------
# 4
# test1.py
通過subprocess可以擴充套件python的功能,類似於作業系統的某些操作應用等。
Python subprocess模組學習總結
從python 2.4開始,python引入subprocess模組來管理子程序,以取代一些舊模組的方法 如 os.system os.spawn os.popen popen2.commands.不但可以呼叫外部的命令作為子程序,而且可以連線到子程序的input output error管道,獲取...
python subprocess模組 學習筆記
subprocess允許你啟動乙個新的程序並與其通訊。subprocess模組中只定義了乙個類,popen。subprocess.popen args,bufsize 0,executable none,stdin none,stdout none,stderr none,preexec fn no...
Python subprocess模組學習總結
從python 2.4開始,python引入subprocess模組來管理子程序,以取代一些舊模組的方法 如 os.system os.spawn os.popen popen2.commands.不但可以呼叫外部的命令作為子程序,而且可以連線到子程序的input output error管道,獲取...