python獲取進(jìn)程的environ信息
獲取進(jìn)程的environ,也就是環(huán)境變量在某些場(chǎng)景下是一件有意義的事情。換一種描述方法,環(huán)境變量對(duì)于一個(gè)進(jìn)程是有意義的,因?yàn)樗鼤?huì)影響到進(jìn)程的行為。
當(dāng)你使用python的虛擬環(huán)境時(shí),其實(shí)就用到了環(huán)境變量,不同虛擬環(huán)境下啟動(dòng)的python進(jìn)程,必然有不同的運(yùn)行環(huán)境,這里特指啟動(dòng)腳本時(shí)所執(zhí)行的python解釋器。除此以外,你可以通過(guò)環(huán)境變量來(lái)向進(jìn)程傳遞一些關(guān)鍵參數(shù),比如jupyterhub 就是通過(guò)環(huán)境變量來(lái)向notebook進(jìn)程傳遞一些關(guān)鍵信息。
1. 在進(jìn)程內(nèi)獲取環(huán)境變量
在進(jìn)程中,獲取環(huán)境變量,根據(jù)環(huán)境變量的值來(lái)執(zhí)行特定的操作,一些項(xiàng)目就是通過(guò)環(huán)境變量來(lái)告訴進(jìn)程當(dāng)前的運(yùn)行環(huán)境是測(cè)試環(huán)境還是線上生產(chǎn)環(huán)境。
在進(jìn)程內(nèi)獲取環(huán)境變量,十分容易
import os
print(os.environ)
2. 在進(jìn)程外獲取環(huán)境變量
在進(jìn)程外獲取環(huán)境變量,也并非難事,本文只關(guān)注linux環(huán)境下如何操作。
在linux系統(tǒng)里,有一個(gè)/proc目錄,這里存在很多名稱全部為數(shù)字的目錄,如下圖所示
每一個(gè)數(shù)字名稱的文件夾,對(duì)應(yīng)著系統(tǒng)里的一個(gè)進(jìn)程,記錄著進(jìn)程的信息,目錄名稱就是進(jìn)程的pid。想要查看一個(gè)進(jìn)程的環(huán)境變量,自然是先要知道進(jìn)程的pid是多少,在對(duì)應(yīng)的目錄下,有一個(gè)名為environ的文件,這里便是這個(gè)進(jìn)程的環(huán)境變量。
/proc文件系統(tǒng)是一個(gè)偽文件系統(tǒng),只存在于內(nèi)存中,它以文件系統(tǒng)的方式為訪問(wèn)系統(tǒng)內(nèi)核數(shù)據(jù)的操作提供接口,當(dāng)你使用命令cat environ 查看環(huán)境變量時(shí),proc文件系統(tǒng)是動(dòng)態(tài)從系統(tǒng)內(nèi)核讀出所需信息并展示給你的。
environ里的數(shù)據(jù)是以key=value的形式存儲(chǔ)的,每一個(gè)key-value對(duì)中間用特殊字符\x00 分隔
LC_ALL=en_US.UTF-8\x00JUPYTERHUB_CLIENT_ID=jupyterhub-user-zhangdongsheng
在終端查看時(shí),是看不到這個(gè)特殊字符的,在解析時(shí),可以用\x00做分隔,在用=字符做分隔,變可以得到進(jìn)程的環(huán)境變量
def get_pro_environ(pid):
with open(f'/proc/{pid}/environ','r')as f:
data = f.read()
data.strip('\x00')
arrs = data.split('\x00')
environ = {}
for item in arrs:
if not item:
continue
lst = item.split('=')
environ[lst[0]] = lst[1]
return environ
if __name__ == '__main__':
print(get_pro_env