2015-09-11 2 views
11

Я пытаюсь скомпилировать, установить и запустить пакет, который мы назовем myPackage. Он содержит файл *.pyx, который вызывает функцию fftw_set_timelimit() из библиотеки fftw. В настоящее время, когда я бег сценария clientScript.py, который импортирует пакет я получаю следующее сообщение об ошибке:Использование setuptools для создания пакета cython, вызывающего внешнюю библиотеку C

Traceback (most recent call last): 
    File "clientScript.py", line 5, in <module> 
    import myPackage.myModule 
ImportError: /usr/local/lib/python2.7/dist-packages/myPackage/myModule.so: undefined symbol: fftw_set_timelimit 

Из того, что я понимаю (я совершенно новый для питона и Cython), связывающий с библиотекой C еще не выполненный в моем пакете. В самом деле, мой setup.py файл выглядит следующим образом:

from setuptools import setup,find_packages 
from Cython.Build import cythonize 
import os 

setup(
    name = "myPackage", 
    version = "0.0.1", 
    url = "none", 
    author = "me", 
    author_email = "[email protected]", 
    packages=find_packages(), 
    ext_modules = cythonize("pyClo/pyClo.pyx"), 
) 

Как вы можете видеть, что мой setup.py файл использует setuptools. Я решил сделать это, так как он рекомендован Python Packaging User Guide. Однако в инструкциях в Cython documentation вместо этого используется distutils. Связывание библиотек осуществляется по вызову distutils.Extension('file',['file.pyx'],libraries='fftw'). Как достичь такого же результата с помощью setuptools?

ответ

13

Оказывается, setuptools имеет модуль setuptools.extension.Extension, который используется так же, как и модуль distutils.extension.Extension.

В конце концов, файл setup.py выглядит примерно так:

from setuptools import setup, find_packages 
from setuptools.extension import Extension 
from Cython.Build import cythonize 

extensions = [ 
    Extension(
     "myPackage.myModule", 
     ["myPackage/myModule.pyx"], 
     include_dirs=['/some/path/to/include/'], # not needed for fftw unless it is installed in an unusual place 
     libraries=['fftw3', 'fftw3f', 'fftw3l', 'fftw3_threads', 'fftw3f_threads', 'fftw3l_threads'], 
     library_dirs=['/some/path/to/include/'], # not needed for fftw unless it is installed in an unusual place 
    ), 
] 

setup(
    name = "myPackage", 
    packages = find_packages(), 
    ext_modules = cythonize(extensions) 
) 

Вот краткий обзор моей директории установки:

. 
├── MANIFEST.in 
├── myPackage 
│   └── myModule.pyx 
├── README.rst 
└── setup.py 

где myModule.pyx файл, который вызывает fftw_set_timelimit().

MANIFEST.in содержит:

include myPackage/*.* 

и README.rst является лишь простой текстовый файл.

+1

Согласно [Distutils документации] (https://docs.python.org/2/distutils/apiref.html#distutils.core.Extension), 'distutils.core.Extension' принимает в качестве первого аргумента: «_ полное имя расширения, включая любые пакеты, т. е. не имя файла или имя пути, а Python dotted name_» Следовательно, вместо '' myPackage/myModule '' должен быть '' myPackage.myModule''. – SylM

+0

@SylM Я не использовал python через некоторое время ... Так что для меня будет несколько усилий, чтобы проверить, что замена косой черты «/» на точку ». как вы предполагаете, действительно работает. Однако, если вы проверите решение и скажите мне, что все в порядке, я отредактирую свой ответ соответствующим образом. «Проверка решения» означает запуск нового проекта с нуля и обеспечение его работы. Хочешь это сделать? ;) –

+0

@GLorieul Я только что использовал этот шаблон с использованием точечного синтаксиса имен и успешно скомпилирован. – Gilly

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

  • Нет связанных вопросов^_^