2013-04-14 2 views
1

저는 C에서 파이썬 확장을 배우거나 실험하고 있습니다. 파이썬적인 방식으로 사용할 수 있도록 C 라이브러리를 랩핑하려고합니다. 예를 들면 : C 코드네임 스페이스/패키지 이름과 파이썬의 C 확장자

import mylib 

widget = mylib.widget.Widget(name="Hello!") 
widget.show() 

mylib.utils.say_hello() 

, PyModule_Create에 전달 모듈의 이름이 각각 "MYLIB", "mylib.widget"및 "mylib.utils"이다. mylib.widget 모듈에는 새로운 Widget 유형이 포함되어 있습니다.

그러나 이러한 확장 패키지/네임 스페이스 스타일로 설치하는 방법을 알아낼 수 없습니다. 나는 시도했다 :

from distutils.core import setup, Extension 

setup(
    ... 
    ext_modules = [Extension('mylib', sources=['src/mylib.c'], ...), 
        Extension('mylib.widget', sources=['src/widget.c'], ...), 
        Extension('mylib.utils', sources=['src/utils.c'], ...)] 
) 

그러나 그것은 작동하지 않는다. "mylib에는 위젯이라는 모듈이 없습니다."

C 확장은 일반적으로 패키지/배포는 어떻게됩니까?

+1

유효한 mylib 패키지가 있습니까? 즉 mylib 디렉토리에 \ _ \ _ init \ _ \ _. py 파일이 있습니다. –

답변

0

와우, 친구. 확장 모듈에는 하위 모듈이있을 수 있지만 C init() 함수에서 확장 모듈을 정의해야 할 수 있습니다. 당신이 보았 듯이 distutils는 바로 그 개념에서 유령을 포기했습니다. 나는이 대신 같은 것을 할 것입니다 :

from distutils.core import setup,Extension 

setup(
    packages = ['package_name'], 
    ext_modules = [ 
    Extension('package_name.widget',sources=['src/widget.c']), 
    Extension('package_name.utils',sources=['src/utils.c']) 
    ] 
) 

을 그리고 파일의 레이아웃을 가질 수 :

ROOT/ 
| -- setup.py 
| -- src/ 
|  | -- widget.c 
|  | -- utils.c 
| -- package_name/ 
|  | -- __init__.py 
|  | -- (other python files) 

에서 package_name/ 디렉토리 내에 끝날 것입니다 이런 식으로 당신의 *.so 파일 (또는 창에 *.pyd) 귀하 파이썬 사이트 패키지.