【问题标题】:numpy.i is missing. What is the recommended way to install it?numpy.i 丢失。推荐的安装方式是什么?
【发布时间】:2014-02-18 13:47:30
【问题描述】:

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

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

  • Scientific Linux 6.4(RHEL 6.4 克隆)+ 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-1.8.0/doc/swig 下存在 numpy.i。但是这个文件在python setup.py install执行时不会自动安装。

所以我想知道在我的系统上安装numpy.i 的最佳或推荐方式是什么。

当我将此库分发给我的同事时,将numpy.i 放入我的代码中可能是一个简单的解决方案。但我担心版本与他们的 NumPy 不匹配。

[1]http://docs.scipy.org/doc/numpy/reference/swig.interface-file.html

【问题讨论】:

  • 您确定要 SWIG 而不是更新的、更 Pythonic 的 Cython 吗? (只是问。)
  • @larsmans 我和我的同事一直在使用这个基于 SWIG 的库,因此使用 Cython 不是我的选择。
  • @larsmans 此外,我们的最终产品将用于 C/C++ 以最大限度地提高其速度。 Python 目前仅用于快速测试目的。
  • 我会购买第一个原因,但为了设置快速测试,Cython 的 IME 比 SWIG 容易得多 :)

标签: python numpy swig


【解决方案1】:

最安全的选择可能只是将numpy.i 的副本与您的项目捆绑在一起,因为 Numpy 本身当前没有安装该文件。

numpy.i 文件是使用 Numpy 的 C-API 编写的,所以向后兼容的问题就像你手动编写相应的 C 代码一样。

【讨论】:

  • 感谢您的建议。我在源代码中包含了取自 NumPy 1.8.0 的最新 numpy.i。这似乎是目前最好的解决方案。我在上述两个系统上测试了这个numpy.i,发现它在我的情况下没有任何问题。
【解决方案2】:

您可以将以下代码 sn-p 添加到您的 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 中运行。

【讨论】:

    【解决方案3】:

    另一种可能性,类似于上面 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

    【讨论】:

      【解决方案4】:

      GitHub page 下载一份 numpy.i 副本并将其放在本地目录中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-05
        • 2018-10-28
        • 2017-05-27
        • 2011-12-05
        • 1970-01-01
        • 2013-06-20
        • 2018-04-21
        相关资源
        最近更新 更多