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

时间:2016-07-13 10:05:28

标签: python multithreading environment-variables

我想创建两个(或更多)线程,并在每个线程中执行不同的外部程序,让我们说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 解决方案,但它在以下方式失败:

function getServerState(changeState) {
  return $http.get("/receiveData").then(function(res) {
    changeState(res.data); // notify the watcher
  }).catch(function(e) {
    /* handle errors here */
  }).then(function() {
    return getServerState(changeState); // poll again when done call
  });
}

4 个答案:

答案 0 :(得分: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 :(得分:1)

使用精彩的plumbum库:

from plumbum import local
with local.env(LD_LIBRARY_PATH = '/aaalib'):
    execute_external_program()

请参阅docs

请注意,您还应该使用plumbum execute_external_program,这意味着不要直接使用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)查看您想要的env,您不需要修改父流程&#39; s env vars要实现这一点,你不需要使用&#34; raw&#34; subprocess模块直接。

答案 2 :(得分:0)

线程不能拥有自己的环境变量,它总是具有其父进程的那些。您可以set the appropriate values when you create the subprocesses for your external programs或使用单独的进程而不是线程。

答案 3 :(得分:0)

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

更改环境

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

def target(some_value):
    os.environ['FOO'] = some_value
    # some_code_here

some_value将通过进程的spawn传递

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