Ich habe eine C-Erweiterung, die Umgebungsvariablen während der statischen Initialisierung lädt. Ich muss in der Lage sein, diese Werte zu ändern und das Modul neu zu laden (ich kann die Tatsache nicht ändern, dass sie statisch geladen werden). Ich habe versucht Einstellung os.environ
, aber es scheint nicht, wie in importlib
eine env
Option zu sein für subprocess.call
Ändern der Umgebungsvariablen vor dem Importlib.Reload
Hier ein Beispiel: Angenommen, ich habe ein Modul definiert als
#include <boost/python.hpp>
#include <cstdlib>
#include <string>
std::string get() {
return ::getenv("HOME");
}
BOOST_PYTHON_MODULE(sample) {
boost::python::def("get", &get);
}
folgt Und ich habe Python-Code:
import importlib, os
import sample as s
print(s.get()) # prints /home/username
# do something like
# os.environ['HOME'] = 'foo'
importlib.reload(s)
print(s.get()) # I would like this to print 'foo'
mit anderen Worten, was ich anstelle von os.environ['HOME'] = 'foo'
tun kann die Umgebungsvariable können in c-Modul ändern?
HINWEIS: Ich kann setenv
nicht verwenden, da die Variablen statisch geladen werden und ich nicht alle Dinge neu initialisieren kann, die von ihnen abhängen.
Sie haben Recht, dass die C-Module nicht neu initialisiert werden. Ich möchte lieber keine neuen Prozesse erstellen, da ich das c-Modul überhaupt erst geschaffen habe, um das zu vermeiden. – JRG
@JRG wenn ich darf, was versuchst du mit dieser c-extension zu erreichen? Offensichtlich versuchen Sie nicht, Umgebungsvariablen zu lesen, denn wenn das der Fall wäre, könnten Sie dies auf der Python-Seite tun und keine c-Erweiterung verwenden. Wenn es ein größeres Ziel gibt, dann könntest du vielleicht Umgebungsvariablen für die Kommunikation vermeiden und etwas anderes verwenden. –