无法从C

时间:2016-11-01 12:46:54

标签: python c numpy python-c-api

我无法使用Python C API打开numpy。 我有以下代码

#include<Python.h>
int main()
{
    Py_Initialize();
    PyRun_SimpleString("import numpy");
    PyObject* numpy = PyImport_ImportModule("numpy");
    Py_Finalize();
    return 0;
}

PyRun_SimpleString("import numpy")行打印到控制台:

  

追踪(最近一次通话):     文件&#34;&#34;,第1行,in     文件&#34; C:\ Users \ matt.heath \ AppData \ Local \ Continuum \ Anaconda3 \ lib \ site-packages \ numpy__init __。py&#34;,第180行,在       来自。 import add_newdocs     文件&#34; C:\ Users \ matt.heath \ AppData \ Local \ Continuum \ Anaconda3 \ lib \ site-packages \ numpy \ add_newdocs.py&#34;,第13行,in       来自numpy.lib导入add_newdoc     文件&#34; C:\ Users \ matt.heath \ AppData \ Local \ Continuum \ Anaconda3 \ lib \ site-packages \ numpy \ lib__init __。py&#34;,第8行,in       来自.type_check import *     文件&#34; C:\ Users \ matt.heath \ AppData \ Local \ Continuum \ Anaconda3 \ lib \ site-packages \ numpy \ lib \ type_check.py&#34;,第11行,in       将numpy.core.numeric导入为_nx     文件&#34; C:\ Users \ matt.heath \ AppData \ Local \ Continuum \ Anaconda3 \ lib \ site-packages \ numpy \ core__init __。py&#34;,第14行,in       来自。导入多阵列   ImportError:无法导入名称&#39;多阵列&#39;

PyImport_ImportModule("numpy")返回NULL

我可以打开其他模块OK(例如PyRun_SimpleString("import chunk");很好)并且import numpy在控制台中可以很好地从Python中运行。

我正在使用Windows 10和Python 3.5。

我该怎么办?

2 个答案:

答案 0 :(得分:0)

实际上,这只是调试版本中的一个问题。我自己构建了python35_d.dll,而发布的dll已经编译好了,所以也许我在make文件中有一些奇怪的设置。无论如何,我想,我可以不用调试而生活。

答案 1 :(得分:0)

这与我经历的相同-尽管我使用了安装程序中预编译的python35_d.dll(在“自定义安装”中选中了所有复选框)。我在Python3.6和3.7中也遇到了类似的问题-因此我怀疑可能需要将其中的“调试”变量拉入DLL。

我根据发布配置创建了一个构建配置“带有符号的发布”,但是启用了符号(调试信息),如下所述:

https://docs.microsoft.com/en-us/cpp/build/how-to-debug-a-release-build?view=vs-2019

  
      
  • 调试发行版

         
        
    1. 打开项目的“属性页”对话框。有关详细信息,请参见在Visual Studio中设置C ++编译器并生成属性。

    2.   
    3. 单击“ C / C ++”节点。将调试信息格式设置为C7兼容(/ Z7)或程序数据库(/ Zi)。

    4.   
    5. 展开链接器,然后单击“常规”节点。将“启用增量链接”设置为“否”(/ INCREMENTAL:NO)。

    6.   
    7. 选择“调试”节点。将“生成调试信息”设置为“是(/ DEBUG)”。

    8.   
    9. 选择“优化”节点。将引用设置为/ OPT:REF,并将COMDAT折叠设置为/ OPT:ICF。

    10.   
    11. 您现在可以调试发布构建应用程序。要查找问题,请单步执行代码(或使用即时调试),直到找到发生故障的位置,然后确定错误的参数或代码。

    12.   
         

    如果应用程序在调试版本中工作,但在发行版本中失败,则其中一种编译器优化可能会暴露源代码中的缺陷。为了找出问题所在,请为每个源代码文件禁用选定的优化,直到找到该文件和引起问题的优化。 (为加快此过程,您可以将文件分为两组,在一组上禁用优化,并且当发现组中有问题时,请继续进行划分,直到隔离出问题文件为止。)

         

    您可以使用/ RTC尝试在调试版本中暴露此类错误。

  •