我想知道是否有一个解决方案从C ++源代码pyd模块导入一次两次。那么要在C中定义具有不同变量值的一个模块的2个独立实例? 这是一个例子。 我有一个简单的cpp模块:
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
int n;
void set(int i)
{
n = i;
}
int get()
{
return n;
}
BOOST_PYTHON_MODULE(test_ext)
{
using namespace boost::python;
def("set", set);
def("get", get);
}
现在我试图导入两次:
In [1]: import sys
In [2]: import test_ext as t1
In [3]: del sys.modules['test_ext']
In [4]: import test_ext as t2
In [5]: t1.set(1)
In [6]: t2.set(2)
In [7]: t1.x=1
In [8]: t2.x=2
In [9]: t1.x
Out[9]: 1
In [10]: t2.x
Out[10]: 2
In [11]: t1.get()
Out[11]: 2
In [12]: t2.get()
Out[12]: 2
正如您所看到的,两个模块都指向同一个变量。如果我在一个模块中设置它,则在另一个模块中更改。
实际上我有一个由Matlab生成的代码,其中有很多全局变量。我想找到一种在多个模块实例中独立运行此代码的方法。 顺便说一句,我使用的是python 2.7
提前致谢!
答案 0 :(得分:1)
这个问题是Python的C扩展正在逃避Python VM沙箱(在Python文档中甚至会注意到这种行为)。
您实际上不能指望在一个地址空间(例如一个进程)中在C中具有多个全局变量实例。它是不可能的,它甚至无论如何都与Python连接。
BTW:你甚至可以实现互联互通。以这种方式在单个进程中运行的两个Python VM。
那么如何解决这个问题:
C级全局变量实际上是一个映射(或字典),其中key是Python VM的标识符(或任何其他适合您的情况)。因为你在C,但这不是最简单的情况。
将模块封装在专用进程空间中 - 启动子进程。但是,如果需要,您将需要解决如何与父进程通信。