2009-05-15 9 views
27

Estoy comenzando un proyecto python pequeño/mediano, probablemente en Test Driven Development. Mis antecedentes están más en C y en java que en python (utilicé hormiga y makefile)¿Qué herramienta (s) de construcción recomiendas para Python?

Sé que en Python puede que no necesites una herramienta de compilación, pero lo haré, porque usaré cython y PyInstaller (la cosa debería trabajar en un par de UNIX diferentes, sin depender directamente de python) y me gustaría la conveniencia de seleccionar las pruebas de CLI, compilar documentos, controlar dependencias, etc.

Somebody se queja de que python carece de una marca como herramienta. Sé que existen pocas herramientas, como scon y paver, pero me gustaría saber de los usuarios reales y no solo de su sitio web. ¿Alguien usa paver?

¿Qué pasa con el setup.py habitual que viene con muchos paquetes? Miré en algunos para ver si hay un uso común, pero no encontré nada interesante (tal vez utilicé los ejemplos incorrectos)

¿Recomienda seguir con las cosas que ya sé (ant y Makefile) al menos ¿para comenzar? Si es así, ¿hay alguna extensión ant que recomiende para python (+ cython + pyinstaller + pyUnit)?


EDIT: para evitar nuevas respuestas como programa de trabajo conjunto de una, tenga en cuenta que, para este proyecto, que tienen una necesidad imperiosa de mi programa de ser un ejecutable independiente, ya que es absolutamente imposible tener una pitón máquina virtual en la plataforma de destino, donde el ejecutable se ejecutará. Tengo exactamente la misma hw disponible para compilar, así que afortunadamente no necesito hacer una compilación cruzada (pero yo haría el desarrollo en un Linux más amigable).

También me gustaría comprobar si mi código se compila en Cython desde el principio, no para optimizarlo prematuramente, sino solo para asegurarme de que no voy demasiado lejos con el uso de funciones incompatibles, lo que requeriría un refactorización dolorosa si se necesita seriamente Cython.

Así que por favor se centran en mi pregunta real

+0

Scons es muy agradable. –

Respuesta

10

Sus requisitos sugieren más bien Scons que, según su página web, tiene más control sobre gran variedad de tareas de construcción que Paver. En este último, terminarías usando un montón de sh() que ejecuta programas de línea de comando regulares.

Recientemente, comencé a usar Paver, que es realmente genial para ejecutar pruebas, compilar documentaciones con Sphinx, pero utilizo solo Python puro. Si desea ver qué es posible con Paver, recomiendo esos 2 artículos: converting-from-make-to-paver y writing-technical-documentation de Doug Hellmann y definitivamente desea consultar su pavement.py configuration file.

4

He estado usando setuptools para esto, a veces en combinación con la hormiga por cosas más complejas, o para la integración con otras construcciones. En general, me ha funcionado bien, pero he escuchado que algunas personas en #python (freenode) se quejan de una calidad de fuente generalmente baja para este paquete y recomiendan el estándar distutils.

Una cosa a tener realmente en cuenta si estás acostumbrado a Java (como yo), es que Python no admite paquetes divididos. Es decir, no puede poner site.db en src/site/db, site.view en src2/site/view, poner src y src2 en PYTHONPATH y esperar que todo funcione. Esto me causó grandes dolores de cabeza con las herramientas de compilación, funcionó un poco esporádicamente :)

14

Si es posible, sugeriría evitar los módulos de extensión (C/cython) al comienzo. Obtenga su código escrito en Python, use una configuración simple basada en distutils, ejecute las pruebas usando -m (python -m mypkg.test.testall, o lo que sea, importe unittest).

Una vez que obtenga su proyecto en un estado cómodo, comience a abordar algunas optimizaciones con cython y la gestión de proyectos adicional que viene con eso. distutils puede construir módulos de extensión, así que no estoy seguro de que necesite make/scons.

project-dir/ 
    setup.py 
    mypkg/ 
    __init__.py 
    mymod.py 
    test/ 
    __init__.py 
    testall.py 
    testsomething_specific.py 
+5

+1: Evita las herramientas de compilación y C hasta que las necesites absolutamente, y puede demostrar que tienes el algoritmo correcto, pero es demasiado lento. Hasta que puedas demostrar que necesitas C, evítalo. –

+0

Entiendo este punto y estoy de acuerdo en general. Pero en este caso específico, absolutamente necesito C desde el principio. Podría evitar la optimización (y tal vez Cython) pero necesito que el programa sea un ejecutable independiente (y por lo tanto pyInstaller) porque tener una máquina virtual de python en la plataforma de destino no es una opción. También me gustaría probar si mi código se compila en Cython, solo para asegurarme de que no voy demasiado lejos con el uso de funciones incompatibles, lo que lo haría inútil, cuando se necesite seriamente Cython. – Davide

+0

Cython es bastante bueno. Solo evite los cierres en su código y el resto sería una refactorización menor (bueno, y he visto hablar de cierres en cython-dev, por lo que podría no ser una práctica necesaria por mucho más tiempo). AFA la necesidad absoluta de C, ¿has visto el módulo ctypes? ¿O los módulos de extensión de Python no son suficientes? No he usado pyInstaller, ¿es algo así como py2exe? Podría haber jurado que py2exe funcionó con setuptools/distutils. Cython dará * pure-Python * directo un aumento del 30% de velocidad. Lo más probable es que quieras más que eso si esta aplicación requiere un rendimiento. (es decir, "cython lang" o C) – jwp

4

Una herramienta que me gusta es virtualenv: http://pypi.python.org/pypi/virtualenv

del sitio: Lo que hace virtualenv es una herramienta para crear entornos Python aisladas. El problema básico que se trata es una de dependencias y versiones, y permisos indirectos. Imagine que tiene una aplicación que necesita la versión 1 de LibFoo, pero otra aplicación requiere la versión 2. ¿Cómo puede usar ambas aplicaciones? Si instala todo en /usr/lib/python2.4/site-packages (o cualquiera que sea la ubicación estándar de su plataforma), es fácil terminar en una situación en la que involuntariamente actualice una aplicación que no debería actualizarse.

También puede probar: http://pypi.python.org/pypi/zc.buildout

del sitio: El proyecto Buildout proporciona soporte para la creación de aplicaciones, especialmente las aplicaciones Python. Proporciona herramientas para ensamblar aplicaciones desde múltiples partes, Python u otras. Una aplicación puede contener múltiples programas, procesos y configuración.

Lo he probado un par de veces, excelente para implementar entornos de desarrollo, tal vez sea demasiado para sus necesidades.

También me han dicho y leído en un par de lugares que la nariz es una herramienta de prueba muy buena http://somethingaboutorange.com/mrl/projects/nose/0.11.1/, estoy buscando algo de tiempo libre para probarlo.

creo que sirve Saludos, Ale

3

para evitar más respuestas como uno de PTC, tenga en cuenta que, para este proyecto, que tienen una necesidad imperiosa de mi programa de ser un ejecutable independiente, ya que es absolutamente imposible tener una pitón máquina virtual en la plataforma de destino, donde el ejecutable se ejecutará. Tengo exactamente la misma hw disponible para compilar, así que afortunadamente no necesito hacer una compilación cruzada (pero yo haría el desarrollo en un Linux más amigable).

También me gustaría comprobar si mi código se compila en Cython desde el principio, no para optimizarlo prematuramente, sino solo para asegurarme de que no voy demasiado lejos con el uso de funciones incompatibles, lo que requeriría un refactorización dolorosa si se necesita seriamente Cython.

Si todo lo que busca es tener un ejecutable independiente, no necesita ejecutar Cython.Hay algunas buenas bibliotecas para hacer esto:

Sin embargo, para ejecutar código Python, usted es simplemente va a tener que instalar un intérprete o máquina virtual en la máquina de destino de alguna forma o forma. Las soluciones que presenté implican simplemente incrustar el intérprete para que sea más fácil de instalar. De hecho, estoy bastante seguro (pero podría estar equivocado) de que Cython no le permitirá construir archivos ejecutables independientes. Está principalmente destinado a crear extensiones para el intérprete de Python.

Sin embargo, hay un par de otras alternativas. Si tiene un intérprete de Java en la máquina de destino, puede ejecutar Jython. También hay un IronPython para .net. Sin embargo, igual tendrá que distribuir los tiempos de ejecución para estos idiomas con su proyecto.

En resumen, si desea un ejecutable independiente sin dependencias, su única opción es ir con C o C++.

+0

Gracias por el mensaje. Como escribí en la pregunta, esto es linux/unix, por lo tanto, py2exe y py2app no ​​son la herramienta adecuada. Evalué freeze.py pero finalmente opté por pyInstaller, como también mencioné en la pregunta. Finalmente sí, Cython (solo) no permite construir un ejecutable independiente, pero pyInstaller sí (y funciona muy bien con pyInstaller) – Davide

1

Si está buscando una herramienta de construcción simple basada en python. Consulte pynt. Las tareas en pynt son funciones de pitón (decoradas). También es compatible con el parámetro de estilo Rake que pasa a las tareas.

Cuestiones relacionadas