10

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

4

2 回答 2

4

如果我没记错的话,这不起作用的原因不是因为环境没有被修改,而是因为当你这样做时importlib.reload(s) c 模块实际上并没有重新初始化

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

于 2017-03-16T20:02:27.287 回答
0

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

于 2017-03-16T20:15:26.333 回答