【问题标题】:How to allow 3rd-party libraries to be imported by scripts called in embedded Python interpreter?如何允许嵌入式 Python 解释器中调用的脚本导入第三方库?
【发布时间】:2012-05-29 12:46:03
【问题描述】:

我已使用 Python C API 将 Python 2.7.2 解释器嵌入到 C++ 应用程序中。

在目标机器上,我不能保证安装 Python,所以我试图让嵌入式解释器查看我的应用程序所在的文件夹。所以在应用程序目录中,我有 Python 的 Lib、Libs 和 DLLs 文件夹。

在代码中,我使用 Py_SetPythonHome() 和 Py_SetProgramName() 来加载 Python 并允许安装标准库。

我正在使用的一个测试脚本有:

import csv

import numpy

csv 行现在没问题。在 \libs 目录中,我可以看到 site-packages\numpy。但是导入在这条线上崩溃。我为此使用 numpy 1.6.1。

我想我可能需要更改模块搜索路径 - 这是正确的吗?实现此目的以允许我的脚本可以访问 numpy 等第三方库的最佳方法是什么?如果有帮助,您可以假设我可以生成 numpy 目录的绝对路径。

编辑:更多信息 - 我已经设法产生回溯,我得到的错误是 \numpy\core\_init_.py 当它尝试“导入多数组”行时”,出现错误“ImportError:DLL 加载失败:找不到指定的模块”。检查目录,我找到了一个 multiarray.pyd。有什么想法吗?

【问题讨论】:

  • 当您说“导入崩溃”时,您的意思是它会引发 ImportError 异常吗?
  • 我发现很难弄清楚错误到底是什么——基本上,我正在尝试使用 PyImport_Import 导入脚本(其中包含要实例化的类)。如果我尝试在脚本中“导入 numpy”,我会得到一个空指针。如果我将其注释掉,我会得到一个非空指针
  • @deStrangis:我检查过了,是的,这是一个导入错误。我在嵌入式解释器的 sys.path 中有 numpy site-packages 目录,但是导入失败了......
  • 我遇到了完全相同的问题。你解决了吗?
  • 我也遇到了同样的问题。你解决了吗?

标签: c++ python


【解决方案1】:

当我使用 python C API 导入 numpy.某些 .pyd 模块无法导入。当我改为boost.python时,没有问题。也许你也可以试试 boost.python。 Here 是样本:

【讨论】:

    【解决方案2】:

    这原来是一个 DLL 不匹配错误。代码正在查找的 numpy 版本的编译路径与我嵌入解释器的 C++ 代码的编译路径略有不同。

    解决方案是针对我在应用程序中使用的 Python 发行版重新编译 numpy,但使用完全相同的编译器设置。这解决了问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多