2011-12-26 63 views
1

我想構建一個Python擴展並使用distutils打包它,但擴展安裝在根包中,不管我如何命名它。我的目錄結構是這樣的:Python擴展沒有安裝到子包中

foo/bar/extension.c 

setup.py看起來是這樣的:

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'])] 
) 

我成立了一個virtualenv和我的Python shell中運行

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! 

我可以更改哪些內容以便第一個導入語句有效,第二個導入語句失敗?

回答

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 2012-01-05 21:20:12

+0

通常情況下,Cython的build_ext類應該擴展distutils類所做的工作,所以distutils文檔應該足夠了,但你永遠不知道。你有沒有測試過我創建__init__.py文件的建議,而不是將ext移動到頂層? – 2012-01-06 16:23:11

+0

是的,我最初設置了這個項目,所以cython文件在一個也有__init__.py的目錄中。你是這個意思嗎?我也在Cython FAQ上看到你不能用子包編譯Cython。我不確定這是否是我的問題的描述:http://wiki.cython.org/FAQ#HowtocompileCythonwithsubpackages – Rich 2012-01-10 16:49:42