2010-11-29 7 views
11

Si tengo un módulo, foo, en Lib/site-packages, puedo simplemente import foo y funcionará. Sin embargo, cuando instalo cosas de huevos, obtengo algo como blah-4.0.1-py2.7-win32.egg como una carpeta, con el contenido del módulo dentro, pero aún así solo necesito hacer import foo, nada complicado. ¿Cómo hace Python para rastrear los huevos? No es solo coincidencia de nombres de directorios como si dejo caer esa carpeta en una instalación de Python sin pasar por dist-utils, no encuentra el módulo.¿Cómo hace Python un seguimiento de los módulos instalados con huevos?

Para ser más claros: Acabo de instalar zope. El nombre de la carpeta es "zope.interface-3.3.0-py2.7-win32.egg". Esto funciona:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import zope.interface 
>>> 

creo una carpeta "bla-4.0.1-py2.7-win32.egg" con un módulo vacío "jaja" en ella (y __init__.py). Esto no funciona:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import blah.haha 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named blah.haha 
>>> 

Esto hace, sin embargo:

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from pkg_resources import require 
>>> require("blah>=1.0") 
[blah 4.0.1 (c:\python27\lib\site-packages\blah-4.0.1-py2.7-win32.egg)] 
>>> import haha 
>>> 

Entonces, ¿cómo hacer que funcione sin require?

+0

La fuente de Python está completamente disponible para usted. Puede leer la implementación de la declaración 'import' sin demasiados problemas. Como dicen: "Use the Source, Luke". –

+16

@ S.Lott: cualquier pregunta puede responderse con un nivel diferente de "hágalo usted mismo". para eso no es este sitio. esto también es más eficiente. en lugar de mirar detenidamente la fuente y perder una hora más o menos, lo que me hace infeliz, puedo pedirle esto aquí, volver a consultar de vez en cuando, obtener mi respuesta, ser feliz, dar un representante a otra persona para darles su liberación de dopamina, hacer que esta pregunta aparezca en google si alguien más quiere saber, etc. – Claudiu

+0

"perdiendo una hora"? De Verdad? El desperdicio parece duro. Aprenderás mucho Y, además, esta parte del doco parece bastante completa. http://docs.python.org/library/modules.html#importing-modules. Me sorprende que no hayas comenzado con la documentación. –

Respuesta

18

Si utiliza la secuencia de comandos easy_install proporcionada por setuptools (o el Distribute tenedor de la misma) para instalar los paquetes como los huevos, se verá que, por defecto, se crea un archivo llamado easy-install.pth en el directorio site-packages de su instalación de Python. Path configuration files son una característica estándar de Python:

Un archivo de configuración de ruta es un archivo cuyo nombre tiene la forma package.pth y existe en uno de los cuatro directorios mencionados anteriormente; sus contenidos son elementos adicionales (uno por línea ) que se agregarán a sys.path.

easy_install hace un uso intensivo de esta característica de Python. Cuando usa easy_install para agregar o actualizar una distribución, modifica easy-install.pth para agregar el directorio egg o zip. De esta forma, easy_install mantiene el control del orden de búsqueda del módulo y asegura que los huevecillos que instala aparezcan al principio del orden de búsqueda. Aquí es un ejemplo de los contenidos de un easy-install.pth:

import sys; sys.__plen = len(sys.path) 
./appscript-0.21.1-py2.6-macosx-10.5-ppc.egg 
./yolk-0.4.1-py2.6.egg 
./Elixir-0.7.1-py2.6.egg 
./Fabric-0.9.0-py2.6.egg 
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginse 
rt',0); sys.path[p:p]=new; sys.__egginsert = p+len(new) 

Como se puede ver aquí y si se examina el código en setuptools, se encuentra que va a algún truco para arrancar en sí y luego cubrir sus pistas que pueden hacer problemas de depuración con site.py y el inicio del intérprete un poco interesante. (Esa es una de las razones por las que a algunos desarrolladores no les gusta usarla).)

Si se utiliza el parámetro -m de easy_install para instalar una distribución lo más múltiples versiones, no se agrega la entrada easy-install.pth para ello o se elimina si ya existe. Esta es la razón por la cual el easy_install documentation le dice que use -m antes de eliminar un huevo instalado.

3

Cuando ejecuta easy_install, copia el huevo en site-packages y pone la ruta a ese huevo en su variable sys.path. (Tenga en cuenta que sys.path no es su variable de entorno PATH, se construye a partir de PYTHONPATH y otras variables de entorno. Por lo tanto, el archivo .egg que instala con easy_install se coloca en alguna variable de entorno y python sabe que debe agregarlo a sys.path cuando el intérprete de Python comienza).

Para que blah.haha funcione en tu ejemplo, ejecuta easy_install blah-4.0.1-py2.7-win32.egg y luego puedes import haha desde dentro de python, o simplemente coloca el módulo haha ​​directamente en site-packages.

Cuestiones relacionadas