私は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
を使用して同じ結果を得るにはどうすればよいですか?
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
_は単なるプレーンテキストファイルです。