我无法使用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。
我该怎么办?
答案 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
调试发行版
打开项目的“属性页”对话框。有关详细信息,请参见在Visual Studio中设置C ++编译器并生成属性。
单击“ C / C ++”节点。将调试信息格式设置为C7兼容(/ Z7)或程序数据库(/ Zi)。
展开链接器,然后单击“常规”节点。将“启用增量链接”设置为“否”(/ INCREMENTAL:NO)。
选择“调试”节点。将“生成调试信息”设置为“是(/ DEBUG)”。
选择“优化”节点。将引用设置为/ OPT:REF,并将COMDAT折叠设置为/ OPT:ICF。
您现在可以调试发布构建应用程序。要查找问题,请单步执行代码(或使用即时调试),直到找到发生故障的位置,然后确定错误的参数或代码。
如果应用程序在调试版本中工作,但在发行版本中失败,则其中一种编译器优化可能会暴露源代码中的缺陷。为了找出问题所在,请为每个源代码文件禁用选定的优化,直到找到该文件和引起问题的优化。 (为加快此过程,您可以将文件分为两组,在一组上禁用优化,并且当发现组中有问题时,请继续进行划分,直到隔离出问题文件为止。)
您可以使用/ RTC尝试在调试版本中暴露此类错误。