web-dev-qa-db-ja.com

setuptoolsを使用して外部Cライブラリを呼び出すcythonパッケージを作成する

私はmyPackageと呼ぶパッケージをコンパイル、インストール、実行しようとしています。ライブラリfftwから関数fftw_set_timelimit()を呼び出す_*.pyx_ファイルが含まれています。現在、パッケージをインポートするスクリプト_clientScript.py_を実行すると、次のエラーメッセージが表示されます。

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

私が理解していること(私はpythonと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のドキュメント の説明では、代わりにdistutilsを使用しています。ライブラリのリンクはdistutils.Extension('file',['file.pyx'],libraries='fftw')の呼び出しを通じて行われます。 setuptoolsを使用して同じ結果を得るにはどうすればよいですか?

21
Gael Lorieul

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_は単なるプレーンテキストファイルです。

26
Gael Lorieul