2011-12-26 24 views
1

Python拡張をビルドしてdistutilsを使用してパッケージ化しようとしていますが、拡張子はどのように名前を付けてもルートパッケージにインストールされます。Python Extensionがサブパッケージにインストールされていません

foo/bar/extension.c 

マイsetup.pyは次のようになります:私はvirtualenvを設定

from distutils.core import setup 
from distutils.extension import Extension 

setup(name='foo.bar.extension', 
     cmdclass={'build_ext': build_ext}, 
     ext_modules=[Extension('foo.bar.extension', 
          sources=['foo/bar/extension.c'])] 
) 

と私のPythonシェルに続いて

python setup.py install 

を実行します。

マイディレクトリのレイアウトは次のようになります
>>> import foo.bar.extension 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named invest_cython_core 
>>> import extension #This works! 

最初のimport文が動作し、2番目のimport文が失敗するように変更することはできますか?

答えて

1

あなたはfoo/__init__.pyfoo/bar/__init__.pyを持っている必要があると思うので、distutilsはまずこれらのパッケージをインストールしてから、拡張モジュールをインストールします。 (エラーは静かな誤動作よりも良いでしょう、私はdistutils2がうまく動作するようにバグレポートを開きます)

カスタムbuild_extクラスを使用していますか? (あなたの例ではcmdclass={'build_ext': build_ext}のために質問しています)これは問題に関わる可能性があります。

+0

お返事ありがとうございます。はい、私はそれが重要であることを認識していませんでしたが、私はCythonのbuild_extモジュールを使用しています。私はこのことについてあまり知らないが、Cythonはネストされた拡張機能でうまく動作しないようだ。私はそれ以来、パッケージのルートに拡張機能を移動し、それはうまく動作しますが、入れ子になった状態でそれを好むでしょう。これは:http://docs.python.org/distutils/index.html#distutils-indexコンパイルされた拡張機能について学ぶために使用するべき唯一のリファレンスですか? – Rich

+0

通常、Cythonのbuild_extクラスは、distutilsのクラスが行うものを拡張するだけでよく、distutilsのdocは十分なはずですが、わかりません。 extをトップレベルに移動する代わりに、__init__.pyファイルを作成するという私の提案をテストしましたか? –

+0

はい、私はもともとプロジェクトをセットアップしていたので、cythonファイルは__init__.pyを持つディレクトリにありました。それはあなたが意味することですか?また、CythonのFAQでは、Cypackをサブパッケージとともにコンパイルできないことが分かりました。私はそれが私の問題が何であるかの記述であるかどうかは分かりません:http://wiki.cython.org/FAQ#HowtocompileCythonwithsubpackages – Rich

関連する問題