2011-11-08 5 views
4

일부 코드를 cython으로 작성했으며 일부는 "Packages “within” modules"입니다. — 이것은 실제로 내 질문에 대한 후속 조치이며 구조는 동일해야합니다. 문제는 이것이 cython이므로 .so.py이 아니라고 생각하고 있습니다.__init__.so (__init__.py 대신) 서브 패키지 마스크

import mystuff 

이 작동, 범위에 __init__.so 작품을 갖는

하지만 아래의 모든 하위 패키지를 마스크 것으로 보인다. 즉,

import mystuff.test.test1 

은 그렇지 않습니다. ImportError: No module named ... 오류가 발생합니다.

어떻게 해결할 수 있습니까? 컴파일하기 전에 .pyx에 추가해야 할 것이 있나요? .c? 또는 다른 이름으로 __init__.so의 이름을 바꿀 수 있으며, 어쨌든 __init__.py으로 가져올 수 있습니다 (참고로 __init__.py은 여전히 ​​패키지임을 나타 내기 위해 .so과 나란히 존재해야합니다). 또는 다른 것.


업데이트 : __path__가 나는 어쩌면 내가 패키지의 __path__ 속성을 조작하여이 문제를 얻을 수 있다는 생각을했다

좋아요 ... .so 패키지에 대해 정의 된 속성이 없습니다. 흥미롭게도 이것은 .py 패키지에 대해 정의되었지만 .so의 경우 오류가 발생합니다. 그것은 해결책이 아니지만 문제의 근원인지 궁금합니다.

답변

2

Cython 코드를 __init__.py이 아닌 파일에 넣고 일반 파이썬으로 가져 오십시오. __init__.py 이전 질문에 대한 답변을 참조하십시오.

+0

필자는이 파일을 별도의 파일에 넣고'__init __. py'에서 가져 오는 것을 고려해 보았지만 같은 것을하기 위해 가져올 수있는 두 개의 모듈로 내 패키지를 오염시키는 것에 대해 걱정했습니다. 나는 "실제"모듈의 이름에'.'을 넣어서 가져 오는 것을 막을 생각이었습니다. 물론 이것은'__init __. py'에서도 가져 오는 것을 막을 것입니다! 그런 다음 복잡한 해결책을 찾는데 너무 어려워졌습니다. 단지 그것을 강조하기 위해 내 마음을 넘지 않았습니다. 아마도 간단한 해결책이 가장 좋습니다. 고맙습니다. – tjm

2

아마도 주어진 문제에 대한 가장 간단한 해결책은 __init__.so 모듈의 이름을 _native.so으로 바꾸는 것일 것입니다.

from _native import * 

을 그리고 당신이 설명하는대로 작동합니다 : 그 후 당신은 다음 줄을 포함 할 것이다 __init__.py을 만들 수 있습니다.

관련 문제