2010-11-29 4 views
11

Si j'ai un module, foo, en Lib/site-packages, je peux juste import foo et cela fonctionnera. Cependant, quand j'installe des choses à partir d'oeufs, je reçois quelque chose comme blah-4.0.1-py2.7-win32.egg en tant que dossier, avec le contenu du module à l'intérieur, mais je n'ai encore besoin que de faire import foo, rien de plus compliqué. Comment Python suit-il les œufs? Ce n'est pas juste la correspondance de dirname comme si je dépose ce dossier dans une installation Python sans passer par dist-utils, il ne trouve pas le module. Pour être plus clair: je viens d'installer zope. Le nom du dossier est "zope.interface-3.3.0-py2.7-win32.egg". Cela fonctionne:Comment Python suit-il les modules installés avec des œufs?

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

créer un dossier "bla-4.0.1-py2.7-win32.egg" avec un module vide "haha" dans (et __init__.py). Cela ne fonctionne pas:

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

Cela fait, si:

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

Alors, comment puis-je le faire fonctionner sans require?

+0

La source Python est entièrement disponible pour vous. Vous pouvez lire l'implémentation de l'instruction 'import' sans trop de problèmes. Comme ils disent: "Utilisez la Source, Luke." –

+16

@ S.Lott: toute question peut être résolue par un niveau différent de «faites-le vous-même». ce n'est pas ce que ce site est pour. c'est aussi plus efficace. au lieu de me pencher à travers la source et de perdre une heure, me rendre malheureux, je peux demander ceci ici, vérifier de temps en temps, obtenir ma réponse, être heureux, donner un représentant à quelqu'un d'autre pour leur donner leur libération de dopamine, avez-vous cette question apparaître sur google si quelqu'un d'autre veut savoir, etc – Claudiu

+0

"perdre une heure"? Vraiment? Le gaspillage semble dur. Vous apprendrez beaucoup. Et, de plus, cette partie du doco semble assez complète. http://docs.python.org/library/modules.html#importing-modules. Je suis surpris que vous n'avez pas commencé avec la documentation. –

Répondre

18

Si vous utilisez le script easy_install fourni par setuptools (ou la fourche Distribute de celui-ci) pour installer des paquets comme des œufs, vous verrez que, par défaut, il crée un fichier nommé easy-install.pth dans le répertoire site-packages de votre installation Python. Path configuration files sont une caractéristique standard de Python:

Un fichier de configuration de chemin est un fichier dont le nom a la forme package.pth et existe dans l'un des quatre répertoires mentionnés ci-dessus; ses contenus sont des éléments supplémentaires (un par ligne ) à ajouter à sys.path.

easy_install fait un usage intensif de cette fonctionnalité Python. Lorsque vous utilisez easy_install pour ajouter ou mettre à jour une distribution, il modifie easy-install.pth pour ajouter le répertoire d'oeufs ou le fichier zip. De cette façon, easy_install maintient le contrôle de l'ordre de recherche du module et s'assure que les oeufs qu'il installe apparaissent tôt dans l'ordre de recherche. Voici un exemple du contenu d'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) 

Comme vous pouvez le voir ici et si vous examinez le code setuptools, vous trouverez il va ruser se bootstrap puis couvrir ses pistes qui peuvent faire des problèmes de débogage avec site.py et le démarrage de l'interpréteur un peu intéressant. (C'est l'une des raisons pour lesquelles certains développeurs n'aiment pas l'utiliser.)

Si vous utilisez le paramètre -m de easy_install installer une distribution comme plusieurs version, l'entrée easy-install.pth car il n'est pas ajouté ou est supprimée si elle existe déjà. C'est pourquoi le easy_install documentation vous dit d'utiliser -m avant de supprimer un oeuf installé.

3

Lorsque vous exécutez easy_install, il copie l'œuf dans les packages de site et place le chemin d'accès à cet œuf sur votre variable sys.path. (Notez que sys.path n'est pas votre variable d'environnement PATH, il est construit à partir de PYTHONPATH et d'autres variables d'environnement.Par conséquent, le fichier .egg que vous installez avec easy_install est placé dans une variable d'environnement et python sait l'ajouter à sys.path lorsque le l'interpréteur python commence). Pour que blah.haha fonctionne dans votre exemple, exécutez easy_install blah-4.0.1-py2.7-win32.egg et import haha depuis python, ou placez le module haha ​​directement dans les packages de site.

Questions connexes