运行 python pyd 模块的几个独立实例
Posted
技术标签:
【中文标题】运行 python pyd 模块的几个独立实例【英文标题】:Running several independent instances of python pyd module 【发布时间】:2014-04-07 18:13:29 【问题描述】:我想知道是否有一种解决方案可以将一个从 C++ 源 pyd 模块编译的文件导入两次。那么,要让一个模块有 2 个独立的实例,并且在 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
提前致谢!
【问题讨论】:
t1 is t2
的结果是什么?
我不确定 t1 是否与 t2 相同,但很明显,在 C++ 中声明的全局变量“n”对于两个模块都是相同的。这不是我们想要的行为。
我已经编辑了一些代码以表明 t1
和 t2
不是同一个模块,尽管底层 C++ 变量 n
对于两者来说是相同的
【参考方案1】:
其中一个问题是 Python 的 C 扩展正在逃离 Python VM 沙箱(Python 文档中甚至有这种行为的注释)。
您实际上不能期望在一个地址空间(例如一个进程)中有多个 C 中的全局变量实例。这是不可能的,它甚至没有连接到 Python。
顺便说一句:实际上,您甚至可以通过这种方式“互连”两个在单个进程中运行的 Python VM。
那么如何解决这个问题:
C 级全局变量实际上是一个映射(或字典),其中 key 是 Python VM 的标识符(或任何其他适合您的情况)。由于您使用的是 C,因此这不是最简单的情况。
在专用进程空间中封装模块 - 启动子进程。但是,如果需要,您将需要解决如何与父进程通信。
【讨论】:
感谢您的详细解释!看似简单的任务需要解决的技术并不那么简单……为每个C算法副本启动多个进程并提供进程间通信的综合手段看起来很麻烦……( 嗯,子流程方法通常实施起来并不难,但我去过那里很多次,我理解您的担忧。也许你可以从 Python subprocess 包中受益——它可以让整个事情变得更简单。以上是关于运行 python pyd 模块的几个独立实例的主要内容,如果未能解决你的问题,请参考以下文章
构建引用 .PYD 的 Python 包/模块的正确方法是啥?
无法使用 SWIG 在 Python 中实例化 C++ 类(获取属性错误)
嵌入 WebAssembly 运行时和实例化 WebAssembly 模块的几大要素