2016-07-13 17 views
2

Ich möchte zwei (oder mehr) Threads erstellen und in jedem von ihnen ein anderes externes Programm, sagen wir aaa und bbb. Diese externen Programme benötigen Bibliotheken, die sich in verschiedenen Verzeichnissen befinden, sagen wir in /aaalib und /bbblib, also muss ich die Umgebungsvariable LD_LIBRARY_PATH setzen, bevor ich sie ausführe. Ich möchte vermeiden, Shell zu verwenden, also Lösungen wie Ausführung LD_LIBRARY_PATH=/aaalib aaa ist nicht gut.Wie setze ich eine threadspezifische Umgebungsvariable in Python?

Die Frage ist: Wie stelle ich die os.environ['LD_LIBRARY_PATH'] so ein, dass es unterschiedliche Werte in verschiedenen Threads haben wird?

PS. Ich habe versucht, die Lösung os.environ['...'] = threading.local()here beschrieben, aber es funktioniert nicht in folgender Weise:

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 

Antwort

1

können Sie versuchen, subprocess Modul und etwas tun, wie folgt aus:

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) 
0

Zuerst einmal denke ich, dass Threads in der gleichen Umgebung bleiben, also rate ich Ihnen, multiprocessing oder subprocess Bibliothek zu verwenden, um Prozesse und nicht Threads zu behandeln. in jeder Prozessfunktion können Sie die Umgebung frei ändern und unabhängig vom Mutter Skript

jeder Prozess dieser Art von Funktion

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

some_value bestanden werden durch den Laich des Prozesses

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

die wunderbare plumbum Bibliothek verwenden:

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

Siehe docs.

Beachten Sie, dass Sie auch plumbum zu execute_external_program verwenden sollten, dh, verwenden Sie subprocess (oder seine Alternativen) nicht direkt. Zum Beispiel diese env-Einstellung Logik zu testen, die Sie tun können:

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

Um klar zu sein, garantiert diese Lösung, dass die Befehle, die Sie in Teilprozesse laufen siehe env (plumbum verwenden) möchten Sie, und Sie müssen nicht die env vars des übergeordneten Prozesses ändern, um das zu erreichen, und Sie müssen das "rohe" Modul subprocess nicht direkt verwenden.

Verwandte Themen