2011-03-01 84 views
59

Soy nuevo en Python y estoy empezando un mini proyecto. pero tengo algunas dudas sobre cómo organizar las carpetas en el "Python Way".¿Cómo organizar un proyecto de Python?

estoy usando PyDev en mi entorno de desarrollo, y cuando se crea un nuevo proyecto se crea una carpeta llamada "src"

+ src 

Ahora, en el PyDev puedo crear "Módulo PyDev" y " PyDev paquete"

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?

Best Regards,

+0

puedo recomendar [esta] (http://docs.python.org/2/ tutorial/modules.html), fuera del [Tutorial oficial de Python] (http://docs.python.org/2/tutorial/modules.html). Es bastante claro y directo. – LiorK

+0

Una publicación útil muy reciente: [Iniciar un proyecto de python de la manera correcta] (http://www.jeffknupp.com/blog/2014/02/04/starting-a-python-project-the-right-way/) – karlcow

Respuesta

38

un paquete es básicamente una carpeta con __init__.py de ficheros por debajo y por lo general algunos módulos, donde el módulo es un archivo *.py. Tiene que ver con import principalmente. Si se agrega a __init__.py indicadores que puede utilizar:

from Indicators.Stochastics import * 

o

from Indicators import Stochastics 

Por cierto, recomendaría a mantener los nombres de módulo/paquete minúsculas. No afecta la funcionalidad pero es más "pitónico".

33

Desde la perspectiva del sistema de archivos, un módulo es un archivo que termina en .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 la

some/ 
    __init__.py 
    foofoo.py 
    thing/ 
     __init__.py 
     barbar.py 

define el paquete some, que tiene un módulo de foofoo y un paquete anidado thing, que de nuevo tiene un módulo de barbar. Sin embargo, cuando se utilizan paquetes y módulos, no es realmente distinguir estos dos tipos:

import some 

some.dothis() # dothis is defined in 'some/__init__.py' 

import some.foofoo # <- module 
import some.thing # <- package 

favor siga PEP8 la hora de seleccionar asignar nombres a los paquetes/módulos (es decir, usan nombres en minúscula).

+2

¿Puedo llamar a la función desde 'foofoo.py' si solo importo algo? Estoy confundido acerca del '__init __. Py', ¿qué debería poner allí? –

4

Un paquete es un directorio con un __init__.py en él. La diferencia con un directorio es que puedes importarlo.

No hay una "forma 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.Por lo tanto, si asumimos que el proyecto se llama "Estadísticas Botond" su estructura sería algo como esto:

botondstats/ 
    indicators/ 
     moving_averages.py 
     stochastics.py 
    strategies/ 
     moving_averages_cross.py 
    example.py 

A continuación, encontrar la clase estocástico haciendo

from botondstats.indicators.stochastics.Stochastics 

(Hay varias maneras de mantener la estructura pero reducir las importaciones, pero esa es otra pregunta).

Puede poner esta estructura bajo src/ si lo desea, pero no es necesario. Yo nunca. En lugar tengo un directorio principal:

BotondStatistics/ 
    docs/ 
    botonstats/ # the above structure 
    setup.py # Distutils/distribute configuration for packaging. 

En este directorio también suelen tener un virtualenv por lo que en realidad también tengo bin/lib/et al. El desarrollo generalmente se realiza ejecutando

./bin/python setup.py tests 

Como utilizo el corredor de prueba de Distrubute para ejecutar las pruebas.

Así es como lo hago. :-)

13

Es posible que desee consultar la libary de la plantilla del 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.

http://pypi.python.org/pypi/modern-package-template

25

Ver python-package-template

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 
+2

hola, ¡Vitaly! Acabo de encontrar tu proyecto. ¿Sigues manteniéndolo? ¡Gracias! – elias

+2

terminado con un 404 –

6

Antes de decidir sobre una estructura de proyecto, es bueno que preguntarse cuál es el propósito del proyecto va a ser. ¿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 ipython notebooks. El portátil capturará el flujo de sus pensamientos, y puede agregar notas en el marcado a su código para referencia posterior.
  • Si es un concepto de juguete que desea investigar, encuentro 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 que más tarde puede distribuirlo, y para que se escala para muchos módulos que 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 
    

Los detalles sobre las razones que me gusta esta estructura are in my blog post, pero la esencia básica es que el directorio de nivel jerárquicamente inferior projectname contiene su proyecto real. A su lado están todas las herramientas que ayudan a administrar (git) y empaquetar (setup.py, MANIFEST.in).

Cuestiones relacionadas