在importlib.reload

时间:2017-03-13 15:32:29

标签: python python-3.x python-importlib

我有一个c-extension,它在静态初始化期间加载环境变量。我需要能够更改这些值并重新加载模块(我无法更改它们是静态加载的事实)。我尝试设置os.environ,但env中似乎没有importlib选项,例如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,因为变量是静态加载的,我无法重新初始化依赖于它们的所有内容。

2 个答案:

答案 0 :(得分:4)

如果我没有弄错的话,这不起作用的原因不是因为环境没有被修改,而是因为当你importlib.reload(s) the c module is not actually re-initialized时。

您可以做的是将您的调用放在另一个进程中,每当您需要重新加载它时,都会创建一个新进程。

答案 1 :(得分:0)

也许你可以在你的或第二个c扩展中使用Py_Finalize和Py_Initialize来替换你的模块重载?但这可能是一种矫枉过正......?