首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行python pyd模块的几个独立实例

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

Stack Overflow用户
提问于 2014-04-07 18:13:29
回答 1查看 224关注 0票数 2

我想知道是否有一个从C++源代码pyd模块中编译两次的解决方案。那么,在C中定义两个不同变量值的模块的两个单独的实例呢?这是一个例子。我有一个简单的cpp模块:

代码语言:javascript
复制
#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);
}

现在我试着两次导入:

代码语言:javascript
复制
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

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-11 08:51:16

这方面的一个问题是Python的C扩展正在转义Python沙箱(甚至在Python文档中也注意到了这种行为)。

实际上,您不能期望在一个地址空间(例如,一个进程)中在C中有多个全局变量实例。这是不可能的,甚至连与Python都没有任何联系。

顺便说一句:实际上,您甚至可以用这种方式“互连”两个Python。

那么如何解决这个问题:

  1. C级全局变量实际上是一个映射(或字典),其中键是Python的标识符(或任何适合您的情况的标识符)。但是,由于您在C语言中,这并不是最简单的情况。
  2. 将模块封装在专用的进程空间中-启动子进程。但是,如果需要,您需要解决如何与父进程通信。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22919998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档