2009-11-05 32 views
6

¿Cómo compilo un módulo de C-Python de modo que sea local para otro? P.ej. si tengo un módulo llamado "bar" y otro módulo llamado "mymodule", ¿cómo compilo "bar" para que se importe a través de "import mymodule.bar"?Extensiones/módulos anidados de Python C?

(Lo siento si esto está mal redactada, no estaba seguro de lo que el término adecuado para que era.)

He intentado lo siguiente en setup.py, pero no parece funcionar:

from distutils.core import setup, Extension 

setup(name='mymodule', 
     version='1.0', 
     author='Me', 
     ext_modules=[Extension('mymodule', ['mymodule-module.c']), 
        Extension('bar', ['bar-module.c'])]) 

Editar

Gracias Alex. Así que esto es lo que terminé usando:

from distutils.core import setup, Extension 

PACKAGE_NAME = 'mymodule' 

setup(name=PACKAGE_NAME, 
     version='1.0', 
     author='Me', 
     packages=[PACKAGE_NAME], 
     ext_package=PACKAGE_NAME 
     ext_modules=[Extension('foo', ['mymodule-foo-module.c']), 
        Extension('bar', ['mymodule-bar-module.c'])]) 

con, por supuesto, una carpeta denominada "mimodulo" que contiene __init__.py.

Respuesta

3

Las instrucciones son here:

Extension ('foo', [ 'src/foo1.c', 'src/foo2.c'])

describe una extensión que vive en el paquete raíz, mientras que

Extension ('pkg.foo', [ 'src/foo1.c', 'src/foo2.c'])

describe el mismo Extensi en el paquete pkg. Los archivos de origen y el código de objeto resultante son idénticos en en ambos casos; la única diferencia es donde en el sistema de archivos (y por lo tanto donde en la jerarquía del espacio de nombres de Python) vive la extensión resultante.

Recuerde, un paquete es siempre un directorio (o archivo zip) que contiene un módulo __init__. Para crear un módulo que sea un cuerpo de paquete, ese módulo se llamará __init__ y vivirá bajo el directorio del paquete (o archivo zip). Nunca lo hice en C; si no funciona hacerlo directamente, nombre el módulo, p. _init en su lugar, y en __init__.py do from _init import * (uno de los pocos usos legítimos de from ... import * ;-).

Cuestiones relacionadas