2014-02-18 3 views
4

Я пишу библиотеку C++, которая может быть вызвана как с C++, так и с Python с помощью интерфейса SWIG-Python. Я хотел бы сделать несколько функций в библиотеке, чтобы вернуть массив numpy, когда они используются в Python.numpy.i отсутствует. Каков рекомендуемый способ его установки?

В документации SWIG [1] указано, что numpy.i, находящееся под номером numpy/docs/swig, может быть использовано для этой цели. Но я не могу найти этот каталог в следующих системах.

  • Scientific Linux 6.4 (RHEL 6.4 клон) + Python 2.6 + NumPy 1.4 (устанавливается с помощью yum)
  • OS X Маверикс + Python 2.7 + NumPy 1.8 (через easy_install)
  • OS X Маверикс + Python 2.7 + NumPy 1,8 (построен из источника python setup.py install)

Там существует numpy.i под numpy-1.8.0/doc/swig если я получить исходный код .tar.gz с сайта NumPy. Но этот файл не устанавливается автоматически, когда выполняется python setup.py install.

Так что я хотел бы знать, какой лучший или рекомендуемый способ установки numpy.i в моей системе есть.

Поскольку я распространяю эту библиотеку среди своих коллег, установка numpy.i в моем коде может быть простым решением. Но я говорю о несоответствии версии с их NumPy.

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

+1

Вы уверены, что хотите SWIG вместо нового и более Pythonic Cython? (Просто спрашиваю.) –

+0

@larsmans Мои коллеги и я используем эту библиотеку на основе SWIG какое-то время, и, таким образом, использование Cython не является моим вариантом. –

+0

@larsmans Кроме того, наш конечный продукт будет использоваться в C/C++ для максимальной его скорости. В настоящее время Python используется только для быстрого тестирования. –

ответ

4

Самый безопасный вариант, вероятно, просто связать копию numpy.i с вашим проектом, так как файл не установлена ​​сама Numpy.

Файл numpy.i написан с использованием C-API Numpy, поэтому вопросы обратной совместимости такие же, как если бы вы написали соответствующий код C вручную.

+0

Спасибо за ваше предложение. Я включил последний «numpy.i», взятый из NumPy 1.8.0 в моем исходном коде. Кажется, это лучшее решение на данный момент. Я тестировал этот «numpy.i» в двух вышеупомянутых системах, чтобы найти, что он работал без каких-либо проблем в моем случае. –

2

Вы можете добавить следующий фрагмент кода в файл setup.py загрузить numpy.i из Github во время сборки:

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 «s и работает как в Python 2 и 3 с установленным requests library.

0

Другая возможность, аналогичная тому, что было предложено Альберто Маркесом выше, заключается в том, чтобы включить 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.

Смежные вопросы