Подтвердить что ты не робот

Изменение переменных среды перед importlib.reload

У меня есть 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, потому что переменные загружаются статически, и я не могу повторно инициализировать все, что от них зависит.

4b9b3361

Ответ 1

Если я не ошибаюсь, причина, по которой это не работает, заключается не в том, что среда не изменяется, а потому, что когда вы делаете importlib.reload(s) модуль c фактически не инициализируется.

Что вы можете сделать, это поместить ваши вызовы в s в другой процесс, и всякий раз, когда вам нужно перезагрузить его, вы создаете новый процесс.

Ответ 2

Может быть, вы можете что-то сделать с Py_Finalize и Py_Initialize в своем или втором расширении c, которое заменит перезагрузку вашего модуля? Но это может быть перебор...?