Paquete de Cython con __init __. Pyx: ¿Posible?

¿Es posible crear un paquete Python 2.7 usando __init__.pyx (comstackdo para __init__.so )? ¿Si es así, cómo? No he tenido suerte de hacerlo funcionar.

Esto es lo que he intentado:

Lo anterior tiene el siguiente comportamiento:

 $ python -c 'import foo; foo.hello_world()' Traceback (most recent call last): File "", line 1, in  ImportError: No module named foo 

Vi el problema de Python # 15576 que fue corregido por este Hg commit . Al observar la confirmación Git equivalente en el espejo Git del repository de Python Hg, veo que se puede acceder a la confirmación desde la etiqueta Python v2.7.5 (así como a todas las versiones posteriores v2.7.x). ¿Hubo una regresión?

De acuerdo con esta muy antigua publicación de la lista de correo , funciona si también tiene un archivo __init__.py (el archivo __init__.py no se usa, pero parece ser necesario para que el directorio sea tratado como un módulo, y por lo tanto el __init__.so archivo a cargar).

Si agrego __init__.py :

 # an exception just to confirm that the .so file is loaded instead of the .py file raise ImportError("__init__.py loaded when __init__.so should have been loaded") 

entonces su ejemplo funciona en Linux Python 2.7.3:

 $ python -c 'import foo; foo.hello_world()' hello world blah 

Esto tiene todos los signos de un caso de esquina con errores, por lo que probablemente no se recomienda. Tenga en cuenta que en Windows esto no parece funcionar para mí dando

 ImportError: DLL load failed: %1 is not a valid Win32 application. 

Addendum (para un poco de contexto extra):

Este comportamiento no parece estar documentado explícitamente. En la descripción original de los paquetes de alrededor de Python 1.5 era que dicen:

sin el __init__.py , un directorio no se reconoce como un paquete

y

Consejo: el orden de búsqueda está determinado por la lista de sufijos devueltos por la función imp.get_suffixes() . Por lo general, los sufijos se buscan en el siguiente orden: “.so”, “module.so”, “.py”, “.pyc”. Los directorios no aparecen explícitamente en esta lista, pero preceden a todas las entradas en ella.

El comportamiento observado es ciertamente consistente con este __init__.py necesario para tratar un directorio como un paquete, pero el archivo .so se carga con preferencia al archivo .py, pero no es inequívoco.

Desde el punto de vista de Cython, este comportamiento parece haberse utilizado para comstackr la biblioteca estándar (en cuyo caso __init__.py siempre hubiera estado presente), o en los casos de prueba que se proporcionan en https://github.com/cython/cython/blob /master/tests/build/package_comstacktion.srctree (y algunos otros ejemplos también). En estos, el archivo “srctree” parece expandirse en una variedad de carpetas que contienen __init__.py (y otros archivos) y luego comstackrse. Es posible que solo tener __init__.so simplemente nunca haya sido probado.

Trate de usar una importación relativa.

en __init__ :

from . import bar

También podría ser from . import foo from . import foo . No he usado python 2 cython en mucho tiempo.