permisos - ¿Cómo organizar un proyecto de Python?
funciones de pandas para leer datos a tablas (8)
Soy nuevo en Python y estoy empezando un mini proyecto. pero tengo algunas dudas sobre cómo organizar las carpetas en el "Python Way".
Estoy usando PyDev en mi entorno de desarrollo, y cuando creo un nuevo proyecto, se crea una carpeta llamada "src"
+ src
Ahora, en PyDev puedo crear "Módulo Pydev" y "Paquete PyDev"
Necesito organizar mi proyecto de la siguiente manera:
+ Indicators
- Moving_averages.py
- Stochastics.py
+ Strategies
- Moving_averages_cross.py
- example.py
¿Cómo puedo organizar esto en términos de módulos y paquetes? ¿Cuál es el significado de módulos y paquetes?
Atentamente,
Antes de decidir sobre una estructura de proyecto, es bueno preguntarse cuál será el propósito del proyecto. ¿Esto será un análisis único? ¿Un concepto de juguete que quieres investigar? ¿Un proyecto completo que pretendes distribuir? La cantidad de esfuerzo que desea poner en la estructuración de su proyecto será diferente.
- Si se trata de un análisis único, me gusta usar los portátiles ipython . El portátil capturará el flujo de sus pensamientos, y puede agregar notas en el marcado a su código para referencia posterior.
- Si desea investigar un concepto de juguete, me parece que un enfoque simple y rápido funciona mejor. Desea poder implementar rápidamente su concepto para descubrir si es factible y, por lo tanto, vale la pena dedicarle más tiempo. Parte de la filosofía de Python es "No intentes la perfección porque" lo suficientemente bueno "a menudo es solo eso". Siempre puede regresar más tarde y estructurar su proyecto de una manera que siga las mejores prácticas de ingeniería de software.
Si desea estructurar su proyecto para luego poder distribuirlo, y para que se adapte a muchos módulos, recomiendo la siguiente estructura:
projectname ├── MANIFEST.in ├── setup.py ├── README ├── .gitignore ├── .git ├── projectname_env └── projectname ├── __init__.py ├── subpackageone │ ├── __init__.py │ ├── second_module.py │ ├── tests │ │ └── test_second_module.py │ └── models │ └── model1 ├── first_module.py └── tests └── test_second_module.py
Las razones detalladas por las que me gusta esta estructura están en mi publicación de blog , pero la esencia básica es que el directorio de nombre de proyecto de nivel jerárquicamente inferior contiene su proyecto real. A su lado están todas las herramientas que ayudan a administrar (git) y empaquetar (setup.py, MANIFEST.in).
Desde la perspectiva del sistema de archivos, un módulo es un archivo que termina con .py
y un paquete es una carpeta que contiene módulos y paquetes (anidados) de nuevo. Python reconoce una carpeta como un paquete si contiene un archivo __init__.py
.
Una estructura de archivos como esa
some/
__init__.py
foofoo.py
thing/
__init__.py
barbar.py
define el paquete como some
, que tiene un módulo foofoo
y una thing
paquete anidado, que nuevamente tiene una barbar
módulo. Sin embargo, al usar paquetes y módulos, realmente no distingue estos dos tipos:
import some
some.dothis() # dothis is defined in ''some/__init__.py''
import some.foofoo # <- module
import some.thing # <- package
Siga PEP8 al seleccionar el nombre de sus paquetes / módulos (es decir, utilice nombres en minúsculas).
El proyecto cookiecutter
de audreyr
incluye varias plantillas de proyectos de Python:
El paquete usa un solo archivo ~/.cookiecutterrc
para crear plantillas de proyecto personalizadas en Python, Java, JS y otros lenguajes.
Por ejemplo, una plantilla de Python compatible con PyPI
:
Es posible que desee consultar la librería de plantilla de paquete moderno. Proporciona una forma de configurar un diseño básico realmente agradable para un proyecto que lo guía a través de algunas preguntas y trata de ayudarlo a obtener algo que pueda distribuirse con bastante facilidad.
Pruebe python_boilerplate_template
:
Un paquete es básicamente una carpeta con el archivo __init__.py
debajo de él y generalmente algunos módulos, donde el módulo es un archivo *.py
. Tiene que ver con la import
principalmente. Si agrega __init__.py
a Indicadores, puede usar:
from Indicators.Stochastics import *
o
from Indicators import Stochastics
Por cierto, recomendaría mantener los nombres de módulos / paquetes en minúsculas. No afecta la funcionalidad pero es más "pitónico".
Un paquete es un directorio con un __init__.py
en él. La diferencia con un directorio es que puedes importarlo.
No existe un "camino de Python" per se, pero encontrará que es una buena idea colocar todos sus módulos en un paquete con un nombre relacionado con el proyecto.
Además, para seguir la guía de estilo de Python, PEP8, los nombres de los paquetes y módulos deben ser minúsculos. Entonces, si asumimos que el proyecto se llama "Estadísticas de Botond", su estructura sería algo como esto:
botondstats/
indicators/
moving_averages.py
stochastics.py
strategies/
moving_averages_cross.py
example.py
Luego encontrarías la clase estocástica haciendo
from botondstats.indicators.stochastics.Stochastics
(Hay varias maneras de mantener la estructura pero reducir las importaciones, pero esa es otra cuestión).
Puede poner esta estructura bajo src/
si lo desea, pero no es necesario. Yo nunca. En cambio, tengo un directorio principal:
BotondStatistics/
docs/
botonstats/ # the above structure
setup.py # Distutils/distribute configuration for packaging.
En este directorio también normalmente tengo un virtualenv así que en realidad también tengo bin / lib / et al. El desarrollo se realiza normalmente ejecutando
./bin/python setup.py tests
Como utilizo el corredor de prueba Distrubute para ejecutar las pruebas.
Así es como lo hago. :-)
Estructura de directorios
.
|-- bin
| `-- my_program
|-- docs
| `-- doc.txt
|-- my_program
| |-- data
| | `-- some_data.html
| |-- __init__.py
| |-- submodule
| | `-- __init__.py
| |-- helpers.py
|-- tests
| |-- __init__.py
| |-- test_helpers.py
|-- Makefile
|-- CHANGES.txt
|-- LICENSE.txt
|-- README.md
|-- requirements-dev.txt
|-- requirements.txt
`-- setup.py
gato Makefile
PYTHON=`which python`
NAME=`python setup.py --name`
all: check test source deb
init:
pip install -r requirements.txt --use-mirrors
dist: source deb
source:
$(PYTHON) setup.py sdist
deb:
$(PYTHON) setup.py --command-packages=stdeb.command bdist_deb
rpm:
$(PYTHON) setup.py bdist_rpm --post-install=rpm/postinstall --pre-uninstall=rpm/preuninstall
test:
unit2 discover -s tests -t .
python -mpytest weasyprint
check:
find . -name /*.py | grep -v "^test_" | xargs pylint --errors-only --reports=n
# pep8
# pyntch
# pyflakes
# pychecker
# pymetrics
clean:
$(PYTHON) setup.py clean
rm -rf build/ MANIFEST dist build my_program.egg-info deb_dist
find . -name ''*.pyc'' -delete