我正在编写一个C ++库,可以使用SWIG-Python接口从C ++和Python调用。我想在库中创建一些函数,以便在Python中使用时返回numpy数组。
SWIG文档[1]表示位于numpy.i
下的numpy/docs/swig
可用于此目的。但是我在以下系统中找不到这个目录。
yum
安装)easy_install
)python setup.py install
构建)如果我从NumPy网站获取.tar.gz源代码,numpy.i
下会存在numpy-1.8.0/doc/swig
。但是,执行python setup.py install
时,不会自动安装此文件。
所以我想知道在我的系统上安装numpy.i
的最佳或推荐方法是什么。
当我将这个库分发给我的同事时,将numpy.i
放在我的代码中可能是一个简单的解决方案。但我担心版本与他们的NumPy不匹配。
[1] http://docs.scipy.org/doc/numpy/reference/swig.interface-file.html
答案 0 :(得分:4)
最安全的选择可能只是将numpy.i
的副本与您的项目捆绑在一起,因为Numpy本身当前没有安装该文件。
numpy.i
文件是使用Numpy的C-API编写的,因此向后兼容性问题与您手动编写相应的C代码相同。
答案 1 :(得分:2)
您可以将以下代码段添加到setup.py
文件,以便在构建时从Github下载numpy.i
:
import re
import requests
import numpy
np_version = re.compile(r'(?P<MAJOR>[0-9]+)\.'
'(?P<MINOR>[0-9]+)') \
.search(numpy.__version__)
np_version_string = np_version.group()
np_version_info = {key: int(value)
for key, value in np_version.groupdict().items()}
np_file_name = 'numpy.i'
np_file_url = 'https://raw.githubusercontent.com/numpy/numpy/maintenance/' + \
np_version_string + '.x/tools/swig/' + np_file_name
if(np_version_info['MAJOR'] == 1 and np_version_info['MINOR'] < 9):
np_file_url = np_file_url.replace('tools', 'doc')
chunk_size = 8196
with open(np_file_name, 'wb') as file:
for chunk in requests.get(np_file_url,
stream=True).iter_content(chunk_size):
file.write(chunk)
它会根据 Numpy 的版本下载合适的文件,并且在安装了requests library的Python 2和3中都可以使用。
答案 2 :(得分:0)
另一种可能性,类似于Alberto Marquez上面提出的,是包含一个Makefile,可以自动下载numpy.i
文件,以防它丢失。这是一个例子,参见${PROGRAM}: ${PROGRAM}.c
下面的行:
# put here the root name of your code
PROGRAM = simple
CC = gcc
CFLAGS = -c -fPIC -O2
LFLAGS = -I/Users/nemmen/anaconda3/include/python3.5m -I/Users/nemmen/anaconda3/lib/python3.5/site-packages/numpy/core/include
all: ${PROGRAM}
${PROGRAM}: ${PROGRAM}.c
[ -f ./numpy.i ] && echo "numpy.i already here, good" || wget https://raw.githubusercontent.com/numpy/numpy/master/tools/swig/numpy.i
swig -python -o ${PROGRAM}_wrap.c ${PROGRAM}.i
$(CC) ${CFLAGS} ${PROGRAM}.c -o ${PROGRAM}.o
$(CC) ${CFLAGS} ${PROGRAM}_wrap.c -o ${PROGRAM}_wrap.o ${LFLAGS}
ld -bundle -flat_namespace -undefined suppress -o _${PROGRAM}.so *.o
clean:
rm -rf *.o *.mod *.so ${PROGRAM}_wrap.c numpy.i __pycache__
有关采用此Makefile的示例,请查看此repo。
答案 3 :(得分:0)
从此GitHub page下载numpy.i的副本,并将其放在本地目录中。