2010-09-04 24 views
8

Soy nuevo en Python y sobre todo usé mi propio código. Pero ahora descargué un paquete que necesito por algún problema que tengo.Python: utilizando los módulos descargados

estructura Ejemplo:

root\ 
    externals\ 
     __init__.py 
     cowfactory\ 
      __init__.py 
      cow.py 
      milk.py 

    kittens.py 

Ahora de __init__.py la cowfactory hace from cowfactory import cow. Esto da un error de importación.

Podría arreglarlo y cambiar la declaración de importación a from externals.cowfactory import cow pero algo me dice que hay una manera más fácil ya que no es muy práctico.

Otra solución podría ser poner el paquete cowfactory en la raíz de mi proyecto, pero eso tampoco es muy ordenado.

Creo que tengo que hacer algo con el archivo __init__.py en el directorio externo, pero no estoy seguro de qué.

Respuesta

6

Dentro del paquete cowfactory, se deben usar las importaciones relativas, como from . import cow. El archivo __init__.py en externos no es necesario. Suponiendo que su proyecto se encuentra en la raíz \ y cowfactory es el paquete externo que ha descargado, puede hacerlo de dos maneras diferentes:

  1. instalar el módulo externo

    paquetes de Python externa por lo general vienen con un archivo " setup.py "que le permite instalarlo. En Windows, sería el comando "setup.py bdist_wininst" y obtendrá un instalador EXE en el directorio "dist" (si se compila correctamente). Use ese instalador y el paquete se instalará en el directorio de instalación de Python. Luego, simplemente puede hacer un import cowfactory tal como lo haría con import os.

    Si tiene instalado pip o easy_install: se pueden instalar muchos paquetes externos (pip incluso permite una fácil desinstalación).

  2. Uso PYTHONPATH para el desarrollo

    Si desea mantener todas las dependencias juntos en el directorio del proyecto, a continuación, mantener todos los paquetes externos en lo externo \ carpeta y añadir la carpeta a la PYTHONPATH. Si está utilizando la línea de comandos, puede crear un archivo por lotes que contiene algo así como

    set PYTHONPATH=%PYTHONPATH%:externals 
    yourprogram.py 
    

    En realidad estoy haciendo algo similar, pero usando PyDev + Eclipse. Allí, puede cambiar las "Configuraciones de ejecución" para incluir la variable de entorno PYTHONPATH con el valor "Externals". Después de configurar la variable de entorno, puede simplemente import cowfactory en sus propios módulos. Tenga en cuenta que eso es mejor que from external import cowfactory porque en este último caso, no funcionaría más una vez que instale su proyecto (o tendría que instalar todas las dependencias externas como un paquete llamado "externo", lo cual es una mala idea).

Las mismas soluciones, por supuesto, también se aplican a Linux, pero con diferentes comandos.

+0

Gracias, en GAE necesito incluir bibliotecas externas dentro del proyecto. Tu respuesta aclara algunas cosas que vi en otros proyectos/ejemplos de GAE. – Pickels

1

En general, debe usar easy_install nuestro pip para instalarlo en el directorio apropiado. Hay un directorio site-packages en Windows donde puede colocar el paquete si no puede usar easy_install por algún motivo. En ubuntu, es /usr/lib/pythonX.Y/dist-packages. Google para su sistema particular. O puede colocarlo en cualquier lugar en su variable de entorno PYTHONPATH.

Como regla general, es bueno no poner libs de terceros en la estructura del directorio de programas (aunque hay opiniones diferentes sobre este control de fuente de vis a vis). Esto mantiene su estructura de directorios lo más minimalista posible.

+0

aha Veo, pero con Google App Engine para incluir libs de tercera parte, debe incluirlas en el directorio de su proyecto. – Pickels

+0

@Pickels, debe editar su pregunta para dejar en claro que usted está en GAE. – aaronasterling

+0

Lo pensé pero ahora sé cómo usar paquetes externos con GAE debido a la información que recibí aquí, así que estoy bastante satisfecho. – Pickels

0

La manera más fácil es usar la variable de entorno $ PYTHONPATH. Se establece que antes de ejecutar secuencias de comandos de la siguiente manera:

export $PYTHONPATH=$PYTHONPATH:/root/externals/ 

Puede agregar tantas carpetas como desee (siempre que su separada por :) y Python buscará en todas las carpetas al importar.

Cuestiones relacionadas