运行python pyd模块的几个独立实例

时间:2014-04-07 18:13:29

标签: python c++ matlab python-2.7

我想知道是否有一个解决方案从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

提前致谢!

1 个答案:

答案 0 :(得分:1)

这个问题是Python的C扩展正在逃避Python VM沙箱(在Python文档中甚至会注意到这种行为)。

您实际上不能指望在一个地址空间(例如一个进程)中在C中具有多个全局变量实例。它是不可能的,它甚至无论如何都与Python连接。

BTW:你甚至可以实现互联互通。以这种方式在单个进程中运行的两个Python VM。

那么如何解决这个问题:

  1. C级全局变量实际上是一个映射(或字典),其中key是Python VM的标识符(或任何其他适合您的情况)。因为你在C,但这不是最简单的情况。

  2. 将模块封装在专用进程空间中 - 启动子进程。但是,如果需要,您将需要解决如何与父进程通信。