Я пытаюсь скомпилировать, установить и запустить пакет, который мы назовем 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
?
Согласно [Distutils документации] (https://docs.python.org/2/distutils/apiref.html#distutils.core.Extension), 'distutils.core.Extension' принимает в качестве первого аргумента: «_ полное имя расширения, включая любые пакеты, т. е. не имя файла или имя пути, а Python dotted name_» Следовательно, вместо '' myPackage/myModule '' должен быть '' myPackage.myModule''. – SylM
@SylM Я не использовал python через некоторое время ... Так что для меня будет несколько усилий, чтобы проверить, что замена косой черты «/» на точку ». как вы предполагаете, действительно работает. Однако, если вы проверите решение и скажите мне, что все в порядке, я отредактирую свой ответ соответствующим образом. «Проверка решения» означает запуск нового проекта с нуля и обеспечение его работы. Хочешь это сделать? ;) –
@GLorieul Я только что использовал этот шаблон с использованием точечного синтаксиса имен и успешно скомпилирован. – Gilly