运行 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”对于两个模块都是相同的。这不是我们想要的行为。 我已经编辑了一些代码以表明 t1t2 不是同一个模块,尽管底层 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 模块的几大要素

ipython notebook 可以导入 pyd 模块,但 python 解释器不能

Selenium模块化驱动测试介绍和实例

python 目录文件