2012-07-16 11 views
12

Tengo varios módulos de python (organizados en paquetes), que dependen el uno del otro. p.ej.¿Cómo compilar y vincular múltiples módulos de python (o paquetes) usando cython?

  • Módulo1
  • Módulo 2: importa el módulo 1
  • Modulo3
  • Module4: importaciones Modulo3, Módulo 2, Módulo 1

Asumamos la interfaz relevante para el desarrollo de aplicaciones está en Module4 y yo quiere generar un Module4.so usando cython. Si procedo de la manera ingenua, obtengo una extensión Module4.so que puedo importar BUT pero la extensión se basa en el código fuente python de Module1, Module2, Module3.

¿Hay alguna manera de compilar para que también Module1, Module2, Module3 sean compilados y vinculados a Module4? Me gustaría evitar hacer todo manualmente, p. primero compile Module1.so luego cambie la declaración de importación en Module2, para importar Module1.so en vez de Module1.py, luego compile Module2 en Module2.so y así sucesivamente ...

¡Gracias!

Respuesta

9

Editar. Las primeras dos opciones se refieren al código específico de Cython, lo que me he perdido es que la pregunta es sobre módulos puros de python, por lo que la opción 3 es la solución.

Hay algunas opciones:

1. Ver este "Cómo crear una jerarquía de módulos en un paquete": https://github.com/cython/cython/wiki/PackageHierarchy

2. prefiero la frase "incluir": http://docs.cython.org/src/userguide/language_basics.html#the-include-statement Tengo muchos archivos .pyx y están todos incluidos en main.pyx, todo está en un espacio de nombres. El resultado es un módulo grande: http://code.google.com/p/cefpython/source/browse/cefpython.pyx

3. Puede compilar todos los módulos a la vez utilizando la configuración mediante la adición de más de una "extensión":

setup(
    cmdclass = {'build_ext': build_ext}, 
    ext_modules = [Extension("example", sourcefiles), Extension("example2", sourcefiles2), Extension("example3", sourcefiles3)] 
) 

4. Una compilación más eficiente - ver here.

setup (
    name = 'MyProject', 
    ext_modules = cythonize(["*.pyx"]), 
) 
+0

gracias, por lo que la opción 3 se ocuparía de importar automáticamente Module3.so en lugar de Module3.py (me refiero al ejemplo anterior)? – Mannaggia

+0

@Mannaggia, Ahh, ahora veo que no usas características específicas de Cython (archivos "pyx"), solo quieres compilar módulos python normales usando cython. Sí, funciona una instrucción "Import Module1" para importar "Module1.py" o "Module1.so" - simplemente no coloque ambos archivos en el mismo directorio ya que no sé qué módulo se importará en ese momento. Nada cambia, .so se trata como un archivo .py al importar. –

+1

@Mannaggia, Nothing changes, .so se trata como un archivo .py al importar. Después de haber compilado los módulos .py para .so, todo debería funcionar de la caja. –

Cuestiones relacionadas