如何在Python中设置特定于线程的环境变量?

如何在Python中设置特定于线程的环境变量?,python,multithreading,environment-variables,Python,Multithreading,Environment Variables,我想创建两个(或更多)线程,并在每个线程中执行不同的外部程序,比如说aaa和bbb。这些外部程序需要位于不同目录中的库,比如在/aaalib和/bbblib中,因此我必须在执行它们之前设置环境变量LD\u LIBRARY\u PATH。我想避免使用shell,所以像executionLD_LIBRARY\u PATH=/aaalib aaa这样的解决方案是不好的 问题是:如何设置os.environ['LD\u LIBRARY\u PATH'],使其在不同线程中具有不同的值 另外,我尝试了所描述

我想创建两个(或更多)线程,并在每个线程中执行不同的外部程序,比如说
aaa
bbb
。这些外部程序需要位于不同目录中的库,比如在
/aaalib
/bbblib
中,因此我必须在执行它们之前设置环境变量
LD\u LIBRARY\u PATH
。我想避免使用shell,所以像execution
LD_LIBRARY\u PATH=/aaalib aaa
这样的解决方案是不好的

问题是:如何设置os.environ['LD\u LIBRARY\u PATH'],使其在不同线程中具有不同的值

另外,我尝试了所描述的解决方案
os.environ['…']=threading.local()
,但以以下方式失败:

In [1]: import os, threading
In [2]: os.environ['LD_LIBRARY_PATH'] = threading.local()
-----------------------
TypeError           Traceback (most recent call last)
<ipython-input-2-a2c8ef0b901b> in <module>()
----> 1 os.environ['LD_LIBRARY_PATH'] = threading.local()
/usr/lib/python2.7/os.pyc in __setitem__(self, key, item)
471                 self.data = environ
472             def __setitem__(self, key, item):
--> 473                 putenv(key, item)
474                 self.data[key] = item
475             def update(self,  dict=None, **kwargs):
TypeError: must be string, not thread._local
[1]中的
:导入操作系统,线程
在[2]中:os.environ['LD_LIBRARY_PATH']=threading.local()
-----------------------
TypeError回溯(最近一次调用上次)
在()
---->1 os.environ['LD_LIBRARY_PATH']=threading.local()
/usr/lib/python2.7/os.pyc in___setitem___(self,key,item)
471 self.data=environ
472定义设置项(自身、键、项):
-->473 putenv(钥匙,项目)
474自身数据[键]=项
475 def更新(自我,dict=None,**kwargs):
TypeError:必须是字符串,而不是线程。\u local

您可以尝试使用
子流程
模块并执行以下操作:

导入子流程
导入操作系统
env=os.environ.copy()
环境['LD_LIBRARY_PATH']='/aaalib'
aaa_process=subprocess.Popen(['aaa'],env=env)
env=os.environ.copy()
环境['LD_LIBRARY_PATH']='/bbblib'
bbb_process=subprocess.Popen(['bbb'],env=env)

线程不能有自己的环境变量,它总是有其父进程的环境变量。您可以选择或使用单独的进程而不是线程。

首先,我想线程保持在同一个环境中,因此我建议您使用
多处理
子进程
库来处理进程,而不是线程。 在每个流程函数中,您可以自由地独立于父脚本更改环境

每个进程都应该具有这种功能

def target(some_value):
    os.environ['FOO'] = some_value
    # some_code_here
要通过进程的繁殖传递的某些值

p = multiprocessing.Process(name=,target=target,args=(some_value,))
p.start()
使用奇妙的图书馆:

请注意,您还应该使用plumbum来执行外部程序,这意味着不要直接使用子流程(或其替代方案)。例如,要测试此环境设置逻辑,可以执行以下操作:

from plumbum import local
with local.env(LD_LIBRARY_PATH = '/aaalib'):
    print(local.python("-c", "import os;print os.environ['LD_LIBRARY_PATH']"))
明确地说,此解决方案保证您在子流程(使用plumbum)中运行的命令可以看到您想要的环境,您不需要修改父流程的环境变量来实现这一点,也不需要直接使用“raw”
子流程
模块

from plumbum import local
with local.env(LD_LIBRARY_PATH = '/aaalib'):
    print(local.python("-c", "import os;print os.environ['LD_LIBRARY_PATH']"))