我想创建两个(或更多)线程,并在每个线程中执行不同的外部程序,让我们说aaa
和bbb
。这些外部程序需要位于不同目录中的库,让我们在/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
});
}
答案 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)
首先,我猜线程保持在相同的环境中,因此我建议您使用multiprocessing
或subprocess
库来处理进程而不是线程。
在每个流程函数中,您可以自由地独立于父脚本
每个过程都应该具有这种功能
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()