python获取进程的environ信息
获取进程的environ,也就是环境变量在某些场景下是一件有意义的事情。换一种描述方法,环境变量对于一个进程是有意义的,因为它会影响到进程的行为。
当你使用python的虚拟环境时,其实就用到了环境变量,不同虚拟环境下启动的python进程,必然有不同的运行环境,这里特指启动脚本时所执行的python解释器。除此以外,你可以通过环境变量来向进程传递一些关键参数,比如jupyterhub 就是通过环境变量来向notebook进程传递一些关键信息。
1. 在进程内获取环境变量
在进程中,获取环境变量,根据环境变量的值来执行特定的操作,一些项目就是通过环境变量来告诉进程当前的运行环境是测试环境还是线上生产环境。
在进程内获取环境变量,十分容易
import os
print(os.environ)
2. 在进程外获取环境变量
在进程外获取环境变量,也并非难事,本文只关注linux环境下如何操作。
在linux系统里,有一个/proc目录,这里存在很多名称全部为数字的目录,如下图所示
每一个数字名称的文件夹,对应着系统里的一个进程,记录着进程的信息,目录名称就是进程的pid。想要查看一个进程的环境变量,自然是先要知道进程的pid是多少,在对应的目录下,有一个名为environ的文件,这里便是这个进程的环境变量。
/proc文件系统是一个伪文件系统,只存在于内存中,它以文件系统的方式为访问系统内核数据的操作提供接口,当你使用命令cat environ 查看环境变量时,proc文件系统是动态从系统内核读出所需信息并展示给你的。
environ里的数据是以key=value的形式存储的,每一个key-value对中间用特殊字符\x00 分隔
LC_ALL=en_US.UTF-8\x00JUPYTERHUB_CLIENT_ID=jupyterhub-user-zhangdongsheng
在终端查看时,是看不到这个特殊字符的,在解析时,可以用\x00做分隔,在用=字符做分隔,变可以得到进程的环境变量
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
评论