2011-11-30 5 views
4

저는 파이썬 모듈을 C로 작성하고 모듈 내부에 모듈을 작성하는 방법을 찾고 있습니다.python c api로 파이썬 모듈 만들기

PyMODINIT_FUNC 
initA(void) 
{ 
PyObject* pMod, pSubMod; 
pMod = Py_InitModule3("A", A_Methods, A_Doc); 
pSubMod = PyModule_New("B"); 
PyModule_AddStringConstant(pSubMod, "__doc__", B_Doc); 
PyModule_AddIntConstant(pSubMod, "SOMETHING", 10); 
PyModule_AddObject(pMod, "B", pSubMod); 
... and so on ... 

컴파일 후, 나는 여러 개의 사운드 합리적인

>>> import A 
>>> print A.B.SOMETHING 
10 
>>> from A import B 
>>> print B.SOMETHING 
10 
>>> from A.B import * 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named B 

먼저 수입 방법, 그리고 잘 작동을 통해 모듈과 일정에 액세스하기 위해 노력하고있어. 그러나 마지막 하나는 작동하지 않습니다. __init__.py 스크립트와 동일한 코드가 있어야합니다. 그러나 별도의 .py 파일을 작성하고 싶지는 않습니다. 오히려 나는 직접 C 초기화 함수에서 그러한 코드를 갖고 싶다.

참고로 두 모듈의 __dict____all__을 첨부 할 예정입니다. A 패키지 아니기 때문에

>>> A.__dict__ 
{'B': <module 'B' (built-in)>, '__package__': None, '__file__': 'A.so'} 
>>> A.B.__dict__ 
{'SOMETHING': 10, '__package__': None, '__name__': 'B', '__doc__': 'B_Doc'} 
>>> A.__all__ 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
AttributeError: 'module' object has no attribute '__all__' 
>>> A.B.__all__ 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
AttributeError: 'module' object has no attribute '__all__' 

감사합니다,

답변

4

당신은 실제로 A.B라는 가져올 수 모듈을 만들지 않았습니다. C로 패키지를 만들 수는 없으며 모듈 만 만들 수 있습니다. 패키지는 파일 시스템에 의해 정의됩니다 (또는 대체 로더에 의해 정의되지만 여기서는 관련이 없습니다).