2010-06-25 27 views
18

Actualmente estoy manteniendo dos de mis propias aplicaciones. Ambos comparten algunos aspectos comunes y, como resultado, comparten algún código. Hasta ahora, he copiado los módulos de un proyecto a otro, pero ahora se está convirtiendo en un problema de mantenimiento. Prefiero tener el código común en un lugar, fuera de ambos proyectos, que ambos pueden importar. Entonces, cualquier cambio en el código común se reflejaría en ambos proyectos.¿Cómo puedo usar código común en python?

Mi pregunta es: ¿cómo puedo hacer esto? ¿Creo una biblioteca con este código? Si es así, ¿cómo usan los proyectos dependientes la biblioteca? Creo que una cosa con la que lucho aquí es que el código común no es realmente útil para nadie más, o al menos no quiero que sea un módulo compatible que otras personas puedan usar.

Si mi pregunta no está clara, hágamelo saber.

Respuesta

18

No hay nada especial que tiene que hacer, Python sólo tiene que encontrar su módulo. Esto significa que debe colocar su módulo común en su PYTHONPATH, o agregar su ubicación al sys.path. See this.

Digamos que tiene

~/python/project1 
~/python/project2 
~/python/libs/stuff.py 
~/python/libs/other.py 

Se puede establecer ya sea PYTHONPATH='~/python/libs' en su entorno OS, o puede hacerlo

import sys, os 
sys.path.append(os.path.expanduser('~/python/libs')) # or give the full path 

Después de que se puede hacer en cualquier lugar import stuff, other.

También se pueden empaquetar sus cosas, entonces usted necesita un diseño de la siguiente manera:

~/python/project1 
~/python/project2 
~/python/libs/mylibname/__init__.py 
~/python/libs/mylibname/stuff.py 
~/python/libs/mylibname/other.py 

~/python/libs/mylibname/__init__.py debe existir, pero puede ser un archivo vacío. Convierte mylibname en package.

Después de agregar la carpeta libs a su ruta como se indicó anteriormente, puede hacer from mylibname import stuff, other.

+0

Eso suena muy simple. Por lo tanto, tengo mis proyectos en el disco, así: - Proyectos - Proyecto - Proyecto 2 - Común por lo 'común' iría en 'PYTHONPATH'? ¿Eso significa que setup.py también necesita establecer 'PYTHONPATH'? Finalmente, ¿a qué puedo llamar el código común? Me preocupa que 'import common.something' no sea muy informativo. Tal vez estoy preocupado por cosas pequeñas. – Jon

+0

gracias! fácil y funciona – Oyiwai

3

Hay muchas maneras para el factor de código por lo que es reutilizable. Realmente depende de su situación específica en cuanto a lo que funcionará mejor. Factorizar su código en paquetes y módulos separados siempre es una buena idea, por lo que el código relacionado permanece unido y puede reutilizarse desde otros paquetes y módulos. Factorizar su código en clases dentro de un módulo también puede ayudar a mantener el código relacionado agrupado.

Yo diría que poner código común en un módulo o paquete que está en su PYTHONPATH y disponible para ambas aplicaciones probablemente sea su mejor solución.

0

Así es como yo lo haría:

  • crea un archivo EGG de su proyecto común:

    ~:zip common.egg common 
    
  • hacer la parte de archivos de huevos de sus bibliotecas

    cp common.egg PROJECT_PATH/lib/ 
    
  • en sus proyectos:

    import glob 
    import os 
    
    def main(): 
        path_lib=os.path.abspath(os.path.split(os.path.abspath(sys.modules['__main__'].__file__))[0] + '/../lib') 
        sys.path += glob.glob(path_lib + '/*.egg') 
        from common import stuff 
        stuff.doCommonStuff() 
    
Cuestiones relacionadas