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

4
我想创建两个(或多个)线程,在每个线程中执行不同的外部程序,比如aaabbb。这些外部程序需要位于不同目录中的库,比如/aaalib/bbblib,因此我必须在执行它们之前设置环境变量LD_LIBRARY_PATH。我想避免使用shell,所以像执行LD_LIBRARY_PATH=/aaalib aaa这样的解决方案不好。
问题是:我该如何设置os.environ ['LD_LIBRARY_PATH'] ,使得不同的线程具有不同的值?
PS. 我尝试过在这里描述的方式下设置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
4个回答

2
您可以尝试使用subprocess模块,然后像这样操作:
import subprocess
import os

env = os.environ.copy()
env['LD_LIBRARY_PATH'] = '/aaalib'
aaa_process = subprocess.Popen(['aaa'], env=env)

env = os.environ.copy()
env['LD_LIBRARY_PATH'] = '/bbblib'
bbb_process = subprocess.Popen(['bbb'], env=env)

1
首先,我认为线程应该保留在同一环境中,所以建议您使用multiprocessingsubprocess库来处理进程而不是线程。 在每个进程函数中,您可以自由且独立地更改环境,而不会影响父脚本。
每个进程都应该有这种类型的函数。
def target(some_value):
    os.environ['FOO'] = some_value
    # some_code_here

一些值将通过进程的生成传递

p = multiprocessing.Process(name=,target=target,args=(some_value,))
p.start()

1
使用美妙的plumbum库:
from plumbum import local
with local.env(LD_LIBRARY_PATH = '/aaalib'):
    execute_external_program()

请查看文档

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

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

清晰明确地说,这个解决方案保证了您在子进程中运行的命令(使用plumbum)看到您想要的环境变量,并且您不需要修改父进程的环境变量来实现这一点,也不需要直接使用“原始”的subprocess模块。

0
一个线程不能有它自己的环境变量,它总是继承自其父进程。你可以在创建外部程序的子进程时设置适当的值(链接1),或者使用单独的进程而不是线程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接