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

标签 python c++ matlab python-2.7

我想知道是否有一种解决方案可以两次导入从 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 虚拟机。

那么如何解决这个问题:

  1. C 级全局变量实际上是一个映射(或字典),其中键是 Python VM 的标识符(或适合您的情况的任何其他内容)。由于您使用的是 C 语言,因此这不是最简单的情况。

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

关于python - 运行 python pyd 模块的几个独立实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22919998/

相关文章:

c++ - cmake 找不到 boost 库,因为它查找了错误的文件名

c++ - 使用带有 C 编译器的纯 C 和 C++ 编译器的 "C part"有什么区别?

arrays - 找出从给定行到末尾的最大元素

matlab - 如何对包含分组数据的矩阵进行行排序

匹配每个括号元素的 Python RegEx

python - 如何在 Python 中使用 BeautifulSoup 分离标签?

python - 区分参数值 `None` 和默认参数值 `None`

python - 解决错误: "list index out of range" in Python

c++ - 什么是裸指针?

python - MATLAB 上的索引矩阵行和列,这段代码可以吗?