搜尋
首頁後端開發Python教學Python標準庫子進程subprocess套件的詳細介紹

這裡的內容以Linux進程基礎和Linux文字流為基礎。 subprocess套件主要功能是執行外部的命令和程式。比如說,我需要使用wget下載檔案。我在Python中呼叫wget程式。從這個意義上來說,subprocess的功能與shell類似。

subprocess以及常用的封裝函數

當我們執行python的時候,我們都是在建立並執行一個行程。正如我們在Linux進程基礎中介紹的那樣,一個進程可以fork一個子進程,並讓這個子進程exec另外一個程式。在Python中,我們透過標準函式庫中的subprocess套件來fork一個子進程,並執行一個外部的程式(fork,exec見Linux進程基礎)。

subprocess套件中定義有幾個建立子進程的函數,這些函數分別以不同的方式建立子進程,所以我們可以根據需要來從中選取一個使用。另外subprocess也提供了一些管理標準流(standard stream)和管道(pipe)的工具,從而在進程間使用文字通訊。

使用subprocess套件中的函數建立子進程的時候,要注意:

1) 在建立子進程之後,父進程是否暫停,並等待子進程運行。

2) 函數傳回什麼

3) 當returncode不為0時,父行程如何處理。

subprocess.call()



父進程等待子進程完成

返回退出訊息(returncode,相當於exit code,見Linux進程基礎)

#
subprocess.check_call()


父親處理子程序完成

返回0

檢查退出訊息,如果returncode不為0,則舉出錯誤subprocess.CalledProcessError,該物件包含有returncode屬性,可用try...except...來檢查(見Python錯誤處理)。

subprocess.check_output()



父進程等待子進程完成

返回子進程向標準輸出的輸出結果

檢查退出訊息,如果returncode不為0,則舉出錯誤subprocess.CalledProcessError,物件包含有returncode屬性和output屬性,output屬性為標準輸出的輸出結果,可用try...except...來檢查。

這三個函數的使用方法相類似,我們以subprocess.call()來說明:

import subprocess
rc = subprocess.call(["ls","-l"])



我們將程式名稱(ls)和所帶的參數(-l)一起放在一個表中傳遞給subprocess.call()

# 可以透過一個shell來解釋一整個字串:

import subprocess
out = subprocess.call("ls -l", shell=True)
out = subprocess.call("cd ..", shell=True)



#我們使用了shell=True這個參數。這個時候,我們使用一整個字串,而不是一個表來運行子程序。 Python會先運行一個shell,再用這個shell來解釋這整個字串。

shell指令中有一些是shell的內建指令,這些指令必須透過shell運行,$cd。 shell=True允許我們執行這樣一些命令。

Popen()

實際上,我們上面的三個函數都是基於Popen()的封裝(wrapper)。這些封裝的目的在於讓我們容易使用子程序。當我們想要更個人化我們的需求的時候,就要轉向Popen類,該類別產生的物件用來代表子進程。

與上面的封裝不同,Popen物件建立後,主程式不會自動等待子程序完成。我們必須呼叫物件的wait()方法,父行程才會等待(也就是阻塞block):

import subprocess
child = subprocess.Popen(["ping","-c","5","www.google.com"])
print("parent process")



從執行結果看到,父行程在開啟子進程之後並沒有等待child的完成,而是直接運行print。

對比等待的情況:

import subprocess
child = subprocess.Popen(["ping","-c","5","www.google.com"])
child.wait()
print("parent process")



此外,你還可以在父進程中對子進程進行其它操作,例如我們上面例子中的child物件:

child.poll()      # 检查子进程状态

child.kill()      # 终止子进程

child.send_signal()  # 向子进程发送信号

child.terminate()   # 终止子进程


子程序的PID儲存在child.pid

子程序的文字流控制
##(沿用child子程序) 子程序的標準輸入,標準輸出和標準錯誤也可以透過以下屬性表示:

 child.stdin

 child.stdout

#  child.stderr

我們可以在Popen()建立子程序的時候改變標準輸入、標準輸出和標準錯誤,並且可以利用subprocess.PIPE將多個子程序的輸入和輸出連接在一起,構成管道(pipe):

import subprocess
child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
child2 = subprocess.Popen(["wc"], stdin=child1.stdout,stdout=subprocess.PIPE)
out = child2.communicate()
print(out)

subprocess.PIPE實際上會為文字流提供一個快取區。 child1的stdout將文字輸出到快取區,隨後child2的stdin從該PIPE中將文字讀走。 child2的輸出文字也被存放在PIPE中,直到communicate()方法從PIPE中讀取出PIPE中的文字。

要注意的是,communicate()是Popen物件的一個方法,該方法會阻塞父進程,直到子進程完成。

我們也可以利用communicate()方法來使用PIPE給子程序輸入:

#

import subprocess
child = subprocess.Popen(["cat"], stdin=subprocess.PIPE)
child.communicate("vamei")


我们启动子进程之后,cat会等待输入,直到我们用communicate()输入"vamei"。

通过使用subprocess包,我们可以运行外部程序。这极大的拓展了Python的功能。如果你已经了解了操作系统的某些应用,你可以从Python中直接调用该应用(而不是完全依赖Python),并将应用的结果输出给Python,并让Python继续处理。shell的功能(比如利用文本流连接各个应用),就可以在Python中实现。

总结

subprocess.call, subprocess.check_call(), subprocess.check_output()

subprocess.Popen(), subprocess.PIPE

Popen.wait(), Popen.communicate()


以上是Python標準庫子進程subprocess套件的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python vs.C:申請和用例Python vs.C:申請和用例Apr 12, 2025 am 12:01 AM

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時的Python計劃:一種現實的方法2小時的Python計劃:一種現實的方法Apr 11, 2025 am 12:04 AM

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python:探索其主要應用程序Python:探索其主要應用程序Apr 10, 2025 am 09:41 AM

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

您可以在2小時內學到多少python?您可以在2小時內學到多少python?Apr 09, 2025 pm 04:33 PM

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?Apr 02, 2025 am 07:18 AM

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到?如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到?Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Python 3.6加載Pickle文件報錯"__builtin__"模塊未找到怎麼辦?Python 3.6加載Pickle文件報錯"__builtin__"模塊未找到怎麼辦?Apr 02, 2025 am 07:12 AM

Python3.6環境下加載Pickle文件報錯:ModuleNotFoundError:Nomodulenamed...

如何提高jieba分詞在景區評論分析中的準確性?如何提高jieba分詞在景區評論分析中的準確性?Apr 02, 2025 am 07:09 AM

如何解決jieba分詞在景區評論分析中的問題?當我們在進行景區評論分析時,往往會使用jieba分詞工具來處理文�...

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版