¿Cuál es la mejor estructura de proyecto para una aplicación Python? [cerrado]
Imagine que desea desarrollar una aplicación de escritorio (no web) no trivial para el usuario final en Python. ¿Cuál es la mejor manera de estructurar la jerarquía de carpetas del proyecto?
Las características deseables son la facilidad de mantenimiento, la compatibilidad con IDE, la idoneidad para la ramificación/fusión del control de fuente y la fácil generación de paquetes de instalación.
En particular:
- ¿Dónde pones la fuente?
- ¿Dónde se colocan los scripts de inicio de aplicaciones?
- ¿Dónde pones el material del proyecto IDE?
- ¿Dónde pones las pruebas unitarias/de aceptación?
- ¿Dónde se colocan los datos que no son de Python, como los archivos de configuración?
- ¿Dónde coloca fuentes que no son de Python, como C++, para módulos de extensión binaria pyd/so?
No importa demasiado. Todo lo que te haga feliz funcionará. No hay muchas reglas tontas porque los proyectos de Python pueden ser simples.
/scripts
o/bin
para ese tipo de cosas de interfaz de línea de comandos/tests
para tus pruebas/lib
para sus bibliotecas en lenguaje C/doc
para la mayoría de la documentación/apidoc
para los documentos API generados por Epydoc.
Y el directorio de nivel superior puede contener archivos README, Config y demás.
La decisión difícil es si utilizar o no un /src
árbol. Python no tiene una distinción entre /src
, /lib
y /bin
como lo hacen Java o C.
/src
Dado que algunos consideran que un directorio de nivel superior no tiene sentido, su directorio de nivel superior puede ser la arquitectura de nivel superior de su aplicación.
/foo
/bar
/baz
Recomiendo poner todo esto en el directorio "nombre-de-mi-producto". Entonces, si estás escribiendo una aplicación llamada quux
, el directorio que contiene todo esto se llama /quux
.
PYTHONPATH
Entonces, otro proyecto puede incluir /path/to/quux/foo
la reutilización del QUUX.foo
módulo.
En mi caso, desde que uso Komodo Edit, mi archivo IDE es un único archivo .KPF. De hecho, lo puse en el /quux
directorio de nivel superior y omití agregarlo a SVN.
Según la estructura del sistema de archivos de Jean-Paul Calderone de un proyecto Python :
Project/
|-- bin/
| |-- project
|
|-- project/
| |-- test/
| | |-- __init__.py
| | |-- test_main.py
| |
| |-- __init__.py
| |-- main.py
|
|-- setup.py
|-- README
Esta publicación de blog de Jean-Paul Calderone se suele dar como respuesta en #python en Freenode.
Estructura del sistema de archivos de un proyecto Python
Hacer:
- Nombra el directorio con algo relacionado con tu proyecto. Por ejemplo, si su proyecto se llama "Twisted", asigne un nombre al directorio de nivel superior para sus archivos fuente
Twisted
. Cuando realice lanzamientos, debe incluir un sufijo de número de versión:Twisted-2.5
.- cree un directorio
Twisted/bin
y coloque allí sus ejecutables, si tiene alguno. No les dé una.py
extensión, incluso si son archivos fuente de Python. No incluya ningún código en ellos, excepto una importación y una llamada a una función principal definida en algún otro lugar de sus proyectos. (Ligero detalle: dado que en Windows, el intérprete se selecciona según la extensión del archivo, los usuarios de Windows en realidad quieren la extensión .py. Por lo tanto, cuando empaquete para Windows, es posible que desee agregarlo. Desafortunadamente, no existe un truco fácil de distutils que Sé que se puede automatizar este proceso. Teniendo en cuenta que en POSIX la extensión .py es solo una verruga, mientras que en Windows la falta es un error real, si su base de usuarios incluye usuarios de Windows, es posible que desee optar por tener solo el .py extensión en todas partes.)- Si su proyecto se puede expresar como un único archivo fuente de Python, colóquelo en el directorio y asígnele un nombre relacionado con su proyecto. Por ejemplo,
Twisted/twisted.py
. Si necesita varios archivos fuente, cree un paquete (Twisted/twisted/
, con un vacíoTwisted/twisted/__init__.py
) y coloque sus archivos fuente en él. Por ejemplo,Twisted/twisted/internet.py
.- coloque sus pruebas unitarias en un subpaquete de su paquete (nota: esto significa que la opción de archivo fuente único de Python anterior fue un truco; siempre necesitará al menos otro archivo para sus pruebas unitarias). Por ejemplo,
Twisted/twisted/test/
. Por supuesto, conviértalo en un paquete conTwisted/twisted/test/__init__.py
. Coloque pruebas en archivos comoTwisted/twisted/test/test_internet.py
.- agregue
Twisted/README
yTwisted/setup.py
para explicar e instalar su software, respectivamente, si se siente bien.No:
- coloque su fuente en un directorio llamado
src
olib
. Esto dificulta su ejecución sin instalación.- coloque sus pruebas fuera de su paquete Python. Esto dificulta la ejecución de pruebas en una versión instalada.
- cree un paquete que solo tenga a
__init__.py
y luego coloque todo su código en__init__.py
. Simplemente cree un módulo en lugar de un paquete, es más simple.- Intente idear trucos mágicos para que Python pueda importar su módulo o paquete sin que el usuario agregue el directorio que lo contiene a su ruta de importación (ya sea a través de PYTHONPATH o algún otro mecanismo). No manejará correctamente todos los casos y los usuarios se enojarán con usted cuando su software no funcione en su entorno.
Consulte Cómo abrir un proyecto Python de la manera correcta .
Permítanme extraer la parte del diseño del proyecto de ese excelente artículo:
Al configurar un proyecto, es importante acertar con el diseño (o estructura de directorios). Un diseño sensato significa que los contribuyentes potenciales no tienen que pasar una eternidad buscando un fragmento de código; Las ubicaciones de los archivos son intuitivas. Dado que estamos tratando con un proyecto existente, significa que probablemente necesitarás mover algunas cosas.
Empecemos por arriba. La mayoría de los proyectos tienen varios archivos de nivel superior (como setup.py, README.md, requisitos.txt, etc.). Entonces hay tres directorios que todo proyecto debería tener:
- Un directorio de documentos que contiene documentación del proyecto.
- Un directorio nombrado con el nombre del proyecto que almacena el paquete Python real.
- Un directorio de prueba en uno de dos lugares.
- En el directorio del paquete que contiene el código de prueba y los recursos.
- Como directorio independiente de nivel superior. Para tener una mejor idea de cómo deben organizarse sus archivos, aquí hay una instantánea simplificada del diseño de uno de mis proyectos, Sandman:
$ pwd ~/code/sandman $ tree . |- LICENSE |- README.md |- TODO.md |- docs | |-- conf.py | |-- generated | |-- index.rst | |-- installation.rst | |-- modules.rst | |-- quickstart.rst | |-- sandman.rst |- requirements.txt |- sandman | |-- __init__.py | |-- exception.py | |-- model.py | |-- sandman.py | |-- test | |-- models.py | |-- test_sandman.py |- setup.py
Como puede ver, hay algunos archivos de nivel superior, un directorio de documentos (el generado es un directorio vacío donde Sphinx colocará la documentación generada), un directorio de Sandman y un directorio de prueba en Sandman.