找不到 numpy.i

Posted

技术标签:

【中文标题】找不到 numpy.i【英文标题】:Trouble finding numpy.i 【发布时间】:2019-10-22 21:53:48 【问题描述】:

我想使用 swig 在 python 中包装一些 c++ 代码,并且我需要能够使用 numpy.i 将 numpy 数组转换为向量。

这是一个非常令人沮丧的过程,因为我无法在网上找到任何有用的信息来说明我实际从哪里获得 numpy.i。

这是我目前正在运行的:

numpy 1.17.3

痛饮 2.0.12

python 3.7.3

Debian 4.9.2

从阅读https://docs.scipy.org/doc/numpy/reference/swig.interface-file.html 得知 numpy.i 应该位于 tools/swig/numpy.i 中,尽管我机器上唯一能找到 numpy.i 的位置是我在 python 2.7 文件夹中'已经升级了。我的 python (3.7.3) 工作版本不包含这样的文件。

$ locate numpy.i
/usr/lib/python2.7/dist-packages/instant/swig/numpy.i

我的尝试:

将 numpy.i(如上所述)复制到我的工作文件夹中。当我调用 %include "numpy.i" 时,我的 test.i 文件至少可以识别这一点,但它似乎不允许使用 numpy.i 调用。

将此代码 https://github.com/numpy/numpy/blob/master/tools/swig/numpy.i 复制到一个名为 numpy.i 的新文件中并将其放入我的文件夹中,但是当我尝试运行它时出现很多错误。

有没有标准的方法来获得正确的 numpy.i 版本?我应该从哪里下载它,我应该把它放在哪里?

我在下面包含了一些代码作为参考:

test.i:

%module test
%
    #define SWIG_FILE_WITH_INIT
    #include "test.h"
%

%include "numpy.i"  //this doesn't seem to do anything
%init %
import_array();
%

%apply (int DIM1) (char x);  //this doesn't seem to do anything

%include "test.h"

test.h:

#include <iostream>

void char_print(char x);

test.cpp:

#include "test.h"

void char_print(char x) 
  std::cout << x << std::endl;
  return;

tester.py:

import test

test.char_print(5)  #nothing is printed, since this isn't converted properly to a char. 

这只是一个简单的示例,但我尝试过以多种不同方式使用 numpy.i(包括复制和粘贴适用于他们的其他人的代码),但无论我是否有它,它始终不会改变任何东西test.i 文件与否。

我在哪里/如何获得 numpy.i?

【问题讨论】:

虽然知道的人可能会帮助你,但作为一般规则,询问在哪里可以找到东西在 Stack Overflow 上是题外话。话虽如此,感谢您努力告诉我们您已经搜索过的位置。 您肯定已经找到 numpy.i 并将其复制到工作目录中即可。问题可能是您的 cout 调用将其打印为 char,但 char(5) 不是可打印字符。 std::cout &lt;&lt; static_cast&lt;int&gt;(x) &lt;&lt; std::endl; 会做你想做的事。 @Chipster 很高兴知道。我的观点是,我知道它不应该在它应该在的地方,通过使用 $ locate numpy.i。我试图证明它不存在,然后询问我如何下载它或通过其他方法获取它。 @Flexo 但它应该是一个字符,因为我使用 %apply 来转换类型,对吧?我的观点是 %apply 没有做任何事情(不仅在这个例子中,而且对于许多其他例子),%include "numpy.i" 也没有。我的 python 3.7.3 文件夹中不应该有那个特定版本的 numpy.i 吗? SWIG 无法更改 C++ 函数本身的行为方式。它只是控制您如何与其他语言的这些功能交互。 IE。它只关心语言的边界,而不是两者的内部。 char 类型的行为是纯粹的 C++ 事物,即使您从 C++ 而不是 Python 调用它,您的 test.cpp 文件也会如此。 【参考方案1】:

问题:我从python2.7包中拷贝过来的numpy.i文件不兼容,并且通过anaconda的时候安装包中没有包含兼容版本(还是不知道他们为什么要这样做)。

答案:找到你运行的numpy版本,然后到这里(https://github.com/numpy/numpy/releases)下载numpy-[your_version].zip文件,然后专门复制numpy.i文件,在 numpy-[your_version]/tools/swig/ 中找到。现在将 numpy.i 粘贴到您的项目工作目录中。

【讨论】:

【参考方案2】:

您应该从https://github.com/numpy/numpy/blob/master/tools/swig/numpy.i 下载新的 numpy.i 文件。在这个 numpy.i 文件中没有 python3 不支持的 PyFile_Check 函数。如果你还在用 /usr/lib/python2.7/dist-packages/instant/swig/numpy.i,你的代码可能会出现错误undefined symbol: PyFile_Check,因为只有python2可以支持PyFile_Check函数。

顺便说一下,当undefined symbol: PyFile_Check出现错误时,不一定是SWIG的问题。

【讨论】:

以上是关于找不到 numpy.i的主要内容,如果未能解决你的问题,请参考以下文章

java为啥每次都是找不到文件。找不到文件?

java 枚举 找不到符号

bat系统找不到指定文件怎么办?

java package找不到符号

SpringBoot报找不到 dao 问题

ubuntu20.04找不到start命令