首先,来看下面一段代码,在主进程中重新为os.environ赋值,但在子进程中并不会起作用,子进程中使用的仍是系统的全部环境变量。

Python程序中创建子进程时对环境变量的要求_python

运行结果:

Python程序中创建子进程时对环境变量的要求_epoll_02

在Python中,为变量重新赋值实际上是修改了变量的引用,这适用于任意类型的变量。对于列表、字典、集合以及类似的可变类型对象,可以通过一定形式改变其中元素的引用而不改变整个对象的引用。os.environ是一个类似于字典的数据结构,这里以字典为例,字典可以通过pop()、popitem()、clear()、update()以及下标赋值等原地操作的方法或操作来修改其中的元素而不影响字典对象的引用。

上面的代码修改如下:

Python程序中创建子进程时对环境变量的要求_python_03

运行结果:

Python程序中创建子进程时对环境变量的要求_java_04

在主进程中清空了所有环境变量,然后创建子进程失败并引发了异常。以Windows操作系统为例,创建子进程时会调用API函数CreateProcessA,该函数要求环境变量至少要包含SYSTEMROOT,否则调用另一个函数CryptAcquireContext时会失败。

为了验证上面的说法,代码修改如下,达到预期目标。

Python程序中创建子进程时对环境变量的要求_java_05

运行效果:

Python程序中创建子进程时对环境变量的要求_java_06

公众号“Python小屋”

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: python