myPackage
というパッケージをコンパイル、インストール、実行しようとしています。ライブラリfftw
から関数fftw_set_timelimit()
を呼び出す*.pyx
ファイルが含まれています。現在、私は次のエラーメッセージを取得し、パッケージをインポートするスクリプトclientScript.py
実行すると:私は(私はPythonとcythonにはかなり新しいです)、Cライブラリとのリンクがまだない理解し何からsetuptoolsを使用して外部Cライブラリを呼び出すcythonパッケージを作成する
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
を私のパッケージで実行されます。あなたは私のsetup.py
ファイルがsetuptools
を使用して見ることができるように
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
ファイルは、次のようになります。私はそれがPython Packaging User Guideによって推奨されているので、そうすることにしました。ただし、Cython documentationの指示には代わりにdistutils
を使用してください。ライブラリをリンクするには、distutils.Extension('file',['file.pyx'],libraries='fftw')
を呼び出します。 setuptools
を使用して同じ結果を達成するにはどうすればよいですか?
[distutils documentation](https://docs.python.org/2/distutils/apiref.html#distutils.core.Extension)によると、 'distutils.core.Extension'は最初の引数として取ります: "拡張子のフルネーム、つまりファイル名やパス名ではなくPythonのドット付き名_" したがって、 "" myPackage/myModule "の代わりに、" "myPackage.myModule" 'が必要です。 – SylM
@SylM私はしばらくの間、Pythonを使用していませんでした...だから、スラッシュ「/」をポイントで置き換えることをもう一度確認する努力がいくつかあります。あなたが実際に働くことを示唆しているように。しかし、ソリューションをテストして、それが大丈夫だと言えば、それに応じて私の答えを編集します。 「ソリューションをテストする」とは、新しいプロジェクトを一から始めることと、それを機能させることができることを確認することです。それをしたいですか? ;) –
@GLorieul私はちょうど上記のテンプレートを点滅した名前の構文を使用して使用し、正常にコンパイルしました。 – Gilly