2015-09-11 5 views
11

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を使用して同じ結果を達成するにはどうすればよいですか?

答えて

13

setuptoolsdistutils.extension.Extensionモジュールと同じ方法で使用されるモジュールsetuptools.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) 
) 

を私のインストールディレクトリの概要は次のとおりです。

myModule.pyxfftw_set_timelimit()を呼び出すファイルです
. 
├── MANIFEST.in 
├── myPackage 
│   └── myModule.pyx 
├── README.rst 
└── setup.py 

MANIFEST.inは含まれています

include myPackage/*.* 

README.rstは単なるプレーンテキストファイルです。

+1

[distutils documentation](https://docs.python.org/2/distutils/apiref.html#distutils.core.Extension)によると、 'distutils.core.Extension'は最初の引数として取ります: "拡張子のフルネーム、つまりファイル名やパス名ではなくPythonのドット付き名_" したがって、 "" myPackage/myModule "の代わりに、" "myPackage.myModule" 'が必要です。 – SylM

+0

@SylM私はしばらくの間、Pythonを使用していませんでした...だから、スラッシュ「/」をポイントで置き換えることをもう一度確認する努力がいくつかあります。あなたが実際に働くことを示唆しているように。しかし、ソリューションをテストして、それが大丈夫だと言えば、それに応じて私の答えを編集します。 「ソリューションをテストする」とは、新しいプロジェクトを一から始めることと、それを機能させることができることを確認することです。それをしたいですか? ;) –

+0

@GLorieul私はちょうど上記のテンプレートを点滅した名前の構文を使用して使用し、正常にコンパイルしました。 – Gilly

関連する問題