2011-12-26 6 views
1

Python 확장을 빌드하고 distutils를 사용하여 패키지하려고하지만 확장자는 루트 패키지에 설치됩니다. 내 디렉토리 레이아웃은 다음과 같습니다Python Extension이 서브 패키지에 설치되지 않음

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 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 문이 작동하고 두 번째 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 문서가 충분해야하지만 결코 알지 못합니다. ext를 최상위로 이동하는 대신 __init__.py 파일을 만드는 제안을 테스트 해 보셨습니까? –

+0

예, 원래 cython 파일도 __init__.py가있는 디렉토리에 있으므로 프로젝트를 설정했습니다. 이게 네가 말하는거야? 또한 Cython FAQ에서 Cython을 하위 패키지와 함께 컴파일 할 수 없다는 것을 알 수 있습니다. 그게 내 문제가 무엇인지에 대한 설명인지 확실하지 않습니다. http://wiki.cython.org/FAQ#HowtocompileCythonwithsubpackages – Rich