numpy.i不见了。建议安装方式是什么?

时间:2014-02-18 13:47:31

标签: python numpy swig

我正在编写一个C ++库,可以使用SWIG-Python接口从C ++和Python调用。我想在库中创建一些函数,以便在Python中使用时返回numpy数组。

SWIG文档[1]表示位于numpy.i下的numpy/docs/swig可用于此目的。但是我在以下系统中找不到这个目录。

  • Scientific Linux 6.4(RHEL 6.4 clone)+ Python 2.6 + NumPy 1.4(通过yum安装)
  • OS X Mavericks + Python 2.7 + NumPy 1.8(通过easy_install
  • OS X Mavericks + Python 2.7 + NumPy 1.8(从源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

4 个答案:

答案 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的副本,并将其放在本地目录中。