2011-11-09 14 views
5

Tengo un problema con cython en buildout.Buildout con construcción de parte con Cython

Una de la parte es una compilación de módulo con cython de un archivo .c y un archivo .pyx.

ya he probar muchas soluciones:

Pero todo termina con el error:

ImportError: No module named Cython.Distutils

Este anexados al cargar el buildout setup.py de este módulo cython.

Tenga en cuenta que el setup.py es funcional cuando se lo llama desde su propio directorio y con un intérprete en el directorio Bin de compilación.

Gracias por su ayuda.

+0

¿Estás seguro de que Cython está instalado correctamente y has establecido la variable de entorno 'PYTHONPATH' para incluir el directorio donde viven los módulos de Cython? –

+0

¿Quiso decir a nivel del sistema? Esto hará que este buildout no sea posible de implementar en un sistema sin cython ...? –

+0

¿Qué quiere decir con "nivel de sistema"? –

Respuesta

4

Los artículos que vinculó le dicen cómo instalar Cython desde una compilación, pero para hacerlo necesita acceso de escritura a la carpeta site-packages. Existen 3 maneras usted debe ser capaz de ejecutar esos buildouts:

  1. Ejecutar como root e instalar Cython en site-packages del pitón sistema. Usualmente quieres evitar hacer esto.

  2. Compila tu propio Python. Esta puede ser la única opción si desea utilizar una versión de Python que no esté ya en el sistema. Hay configuraciones de construcción que te permitirán construir cualquier versión de Python desde el interior del buildout.

  3. Use virtualenv. Esto creará (en la carpeta de compilación) un entorno virtual completo para Python, incluida su propia carpeta site-packages. Esta suele ser la mejor forma de ejecutar un buildout que puede usar el sistema Python (o cualquier otro Python que ya haya instalado en todo el sistema).

le sugiero que haga uso de virtualenv parte de las instrucciones de instalación para su software.

+0

Gracias por esta proposición, voy a excavar de esta manera. –

1

No hay forma de hacer esto como un solo paso, pero es fácil de hacer como un proceso de dos pasos.

Uso:

python bootstrap.py 
./bin/buildout install cython 
./bin/cpy bootstrap.py 
./bin/cpy ./bin/buildout 

La razón de que esto es posible es porque buildout soporta una opción oscura 'instalar', que nadie habla, pero puede usarlo, así:

[buildout] 
parts = deps py # <---- Notice we don't depend on cython here 
eggs = 
    whatever 
    kdist 
    nark 
    kivy # <--- But we do have a module that requires cython to build 
develop = 
    . 
    lib/nark 
    lib/kivy-dist 

[cython] # <---- By calling ./bin/buildout install cython we trigger this 
recipe = zc.recipe.egg:script 
parts = cython-py 
interpreter = cpy # <--- Which makes our dummy ./bin/cpy 
eggs = 
    cython 
    pyinstaller 

[deps] 
recipe = zc.recipe.egg:eggs 
eggs = ${buildout:eggs} 

[py] 
recipe = zc.recipe.egg:script 
interpreter = py 
eggs = ${buildout:eggs} 

Lo bueno de este enfoque es que ejecutar buildout por segunda vez borra el directorio bin, así que al final del día, te queda un directorio bin que l ooks como este:

$ ls bin/ 
buildout garden py 

hay paquetes sobrantes que pueden o no pueden quedarse en su virtualenv y enredar las cosas más adelante. Por eso estamos usando buildout en primer lugar, ¿verdad?

... por supuesto, si quiere que cython se quede, también lo pega en las dependencias de la parte superior.

+0

Tan genial no sabía acerca de ese parámetro y es la pieza faltante que estaba buscando (para no reconstruir todas las partes siempre al ejecutar buildout). Gracias! –

2

Encontré hoy esta receta https://pypi.python.org/pypi/mr.cython/1.0 que resuelven el problema.

Esto resuelve el problema mediante la instalación de Cython con una receta extensión para que esté disponible cuando buildout plazo setup.py develop

El problema era construir un módulo Cython sin tener instalado como a nivel de sistema Cython.

+0

La respuesta me parece bien. OP está respondiendo a su propia pregunta con una solución y un contexto relevantes. –

+0

El hecho de que OP regresa varios años después de la pregunta original para proporcionar una respuesta está muy en el espíritu de StackOverflow y merece votaciones ascendentes. Ver XKCD relevante: https://xkcd.com/979/ –

+0

@ HåkenLid: Bien dicho, yo voté también. @ OP: también puedes aceptar tu respuesta :-) –