嵌入式 Python 加载模块但不加载该模块的内部导入语句

Posted

技术标签:

【中文标题】嵌入式 Python 加载模块但不加载该模块的内部导入语句【英文标题】:Embedded Python loads module but does not load that module's internal import statements 【发布时间】:2011-04-03 22:05:00 【问题描述】:

终于(!)我编译了 Boost::Python 并让我的 XCode 项目导入本地模块。此模块以from xml.dom import minidom 行开头,但在执行时,我收到此错误:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "FeedStore.py", line 1, in <module>
    from xml.dom import minidom
ImportError: No module named xml.dom

但是,我知道我已经安装了 xml Python 模块——当我从命令提示符打开 Python 并输入 from xml.dom import minidom 时,一切都很顺利。此外,当我导入模块时,它的行为与我预期的一样。

我怀疑 sys.path 有问题,所以我将我从提示中得到的那个与我的嵌入式模块中使用的那个进行了比较。唯一的区别是嵌入的 sys.path 不包含 ''。我试过附加它,但这并没有改变行为。

我还怀疑嵌入式版本访问的 Python 版本与我在提示中使用的版本不同,但 sys.prefix 在两次执行之间匹配。

这是导入我的模块并运行它的代码。目前它非常简单(甚至还没有引用计数),因为此时我只想确保我能够嵌入我的模块(我是一个完全新手 C++ 程序员)。

    Py_Initialize();

    //PyRun_SimpleString("import sys");
    //PyRun_SimpleString("sys.path.append('')"); //tried this to no avail!

    PySys_SetPath("/Users/timoooo/Documents/Code/TestEmbed/"); //this allows me to import my local module


    PyRun_SimpleString("import FeedStore as fs"); //here's where it whines about the lack of xml.dom
    PyRun_SimpleString("store = fs.feedStore()");
    PyRun_SimpleString("print store.next()");

    Py_Finalize();

我可能误解了关于 boost::python 的一些重要内容。谁能帮帮我?

【问题讨论】:

【参考方案1】:

尽管具有相同的 sys.path 值,但调用 PyRun_SimpleString("sys.path.append(\"&lt;&lt;path&gt;&gt;\")"); 我需要的地方解决了问题。

【讨论】:

以上是关于嵌入式 Python 加载模块但不加载该模块的内部导入语句的主要内容,如果未能解决你的问题,请参考以下文章

Python C API - 重新加载模块

Python模块 实现过渡性模块重载

实现简单的 JS 模块加载器

python 怎样添加模块加载路径

基本自定义检查 python 模块加载失败

Python之reload函数