У меня есть c-расширение, которое загружает переменные среды во время статической инициализации. Мне нужно иметь возможность изменять эти значения и перезагружать модуль (я не могу изменить факт, что они загружаются статически). Я попытался установить os.environ
, но в importlib
не существует опции env
, как для subprocess.call
Вот пример: предположим, что у меня есть модуль, определенный следующим образом
#include <boost/python.hpp>
#include <cstdlib>
#include <string>
std::string get() {
return ::getenv("HOME");
}
BOOST_PYTHON_MODULE(sample) {
boost::python::def("get", &get);
}
И у меня есть код python:
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'
Другими словами, что я могу сделать вместо os.environ['HOME'] = 'foo'
, чтобы изменить переменную среды в c-модуле?
ПРИМЕЧАНИЕ: я не могу использовать setenv
, потому что переменные загружаются статически, и я не могу повторно инициализировать все, что от них зависит.