我想知道是否有一种解决方案可以两次导入从 C++ 源 pyd 模块编译的一个。那么要让一个模块的两个独立实例具有在 C 中定义的不同变量值? 这是例子。 我有一个简单的 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
提前致谢!
最佳答案
一个问题是 Python 的 C 扩展正在逃避 Python VM 沙箱(甚至在 Python 文档中提到了这种行为)。
实际上,您不能指望在一个地址空间(例如一个进程)中拥有多个 C 语言的全局变量实例。这是不可能的,甚至与 Python 没有任何联系。
顺便说一句:实际上,您甚至可以通过这种方式“互连”在单个进程中运行的两个 Python 虚拟机。
那么如何解决这个问题:
C 级全局变量实际上是一个映射(或字典),其中键是 Python VM 的标识符(或适合您的情况的任何其他内容)。由于您使用的是 C 语言,因此这不是最简单的情况。
在专用进程空间中封装模块 - 启动一个子进程。但是,如果需要,您将需要解决如何与父进程通信。
关于python - 运行 python pyd 模块的几个独立实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22919998/