找不到 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 << static_cast<int>(x) << 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的主要内容,如果未能解决你的问题,请参考以下文章