Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using setuptools to create a cython package calling an external C library

Tags:

I am trying to compile, install and run a package that we'll call myPackage. It contains a *.pyx file that calls the function fftw_set_timelimit() from library fftw. Currently, when I run a script clientScript.py that imports the package I obtain the following error message :

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 

From what I understand (I am quite new to python and cython), the linking with the C library is not yet performed in my package. Indeed, my setup.py file looks like this :

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"), ) 

As you can see my setup.py file uses setuptools. I decided to do so since it is recommended by the Python Packaging User Guide. However, the instructions in the Cython documentation use distutils instead. Linking libraries is done through a call to distutils.Extension('file',['file.pyx'],libraries='fftw'). How do I achieve the same result using setuptools ?

like image 411
Gael Lorieul Avatar asked Sep 11 '15 16:09

Gael Lorieul


People also ask

What is the use of Setuptools?

Setuptools is a package development process library designed to facilitate packaging Python projects by enhancing the Python standard library distutils (distribution utilities). It includes: Python package and module definitions. Distribution package metadata.


1 Answers

It turns out setuptools has a module setuptools.extension.Extension which is used in the same way as the distutils.extension.Extension module .

In the end, the setup.py file looks something like :

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) ) 

Here is an overview of my installation directory :

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

where myModule.pyx is the file that calls fftw_set_timelimit().

MANIFEST.in contains :

include myPackage/*.* 

and README.rst is a mere plain text file.

like image 62
Gael Lorieul Avatar answered Nov 11 '22 21:11

Gael Lorieul