86 votes

Qu'est-ce qui configure sys.path avec Python et quand?

Quand je le lance

import sys 
print sys.path

sur mon Mac (Mac OS X 10.6.5, Python 2.6.1), j'obtiens les résultats suivants.

/Library/Python/2.6/site-packages/ply-3.3-py2.6.oeuf
...
/Library/Python/2.6/site-packages/ipython-0.10.1 l'a-py2.6.oeuf
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python26.zip
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plate-darwin
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plate-mac
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plate-mac/lib-scriptpackages

/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-vieux
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload
/Library/Python/2.6/site-packages
/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC
/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/wx-2.8-mac-unicode

Elles sont regroupées en 5 catégories.

  • /Library/Python/2.6/site-packages/*.oeuf
  • /Library/Python/2.6/site-packages
  • Cadres/Python.framework/Versions/2.6/lib/python2.6
  • Cadres/Python.framework/Versions/2.6/Extras/lib/python
  • CHEMIN de la variable d'environnement PYTHONPATH.

Et je peux ajouter plus de chemins à l'aide du code

sys.path.insert(0, MORE_PATH)
  • Ce que les routines met en place ces chemins, et quand?
  • Sont quelques-uns des chemins d'accès sont intégrées dans le code source python?
  • Est-il possible que les chemins d'accès inséré avec " sys.chemin d'accès.insérer " sont ignorés? Je suis curieux de savoir à ce sujet, comme avec mod_wsgi, j'ai trouvé les chemins ne sont pas trouvés avec " sys.chemin d'accès.insérer". J'ai demandé à un autre post pour cette question.

AJOUTÉ

Basé sur Michael réponse, j'ai regardé dans site.py et j'ai eu le code suivant.

def addsitepackages(known_paths):
    """Add site-packages (and possibly site-python) to sys.path"""
    sitedirs = []
    seen = []

    for prefix in PREFIXES:
        if not prefix or prefix in seen:
            continue
        seen.append(prefix)

        if sys.platform in ('os2emx', 'riscos'):
            sitedirs.append(os.path.join(prefix, "Lib", "site-packages"))
        elif sys.platform == 'darwin' and prefix == sys.prefix:
            sitedirs.append(os.path.join("/Library/Python", sys.version[:3], "site-packages"))

Je pense aussi que le nom du répertoire qui a site.py (/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6 pour mon Mac) devraient être intégrées dans le code source Python.

34voto

Michael Points 4361

La plupart des choses, est mis en place en Python site.py qui est importé automatiquement lors du démarrage de l'interpréteur (sauf si vous démarrez avec l' -S option). Quelques chemins d'accès sont mis en place dans l'interpréteur lui-même lors de l'initialisation (vous pouvez savoir en commençant par python avec -S).

En outre, certains cadres (comme Django, je pense) modifier sys.path lors du démarrage pour répondre à leurs exigences.

L' site module a une assez bonne documentation, a commenté le code source et affiche quelques informations si vous l'exécuter via python -m site.

16voto

Andrew Clark Points 77748

À Partir De L'Apprentissage De Python:

sys.chemin d'accès est le module de recherche de chemin. Python configure au programme de démarrage, la fusion automatique de la répertoire de base du fichier de niveau supérieur (ou une chaîne vide pour désigner l' répertoire de travail en cours), tout PYTHONPATH répertoires, le contenu de tout .la pth chemins d'accès aux fichiers que vous avez créé, et la bibliothèque standard les répertoires. Le résultat est une liste de nom de répertoire des chaînes Python des recherches sur chaque importation d'un nouveau fichier.

6voto

damirv Points 65

site.py est en effet la solution. Je voulais supprimer toutes les dépendances de l'ancien Python installé par défaut sur mon mac. Cela fonctionne plutôt bien, puisque 'site.py' est appelé à chaque démarrage de l'interpréteur python.

Pour Mac, j'ai ajouté manuellement la ligne suivante à la fin de main () dans / System / Library / Frameworks / Python.framework/Versions/2.7/Extras/lib/python/site.py:

     sys.path =  filter (lambda a: not a.startswith('/System'), sys.path)
 

4voto

nate c Points 3909

Chemin a ces parties:

  • Chemins de système d'exploitation contenant vos bibliothèques système
  • répertoire actuel python commencé à partir de
  • variable environnementale $PYTHONPATH
  • vous pouvez ajouter des chemins au moment de l'exécution.

Les chemins ne sont pas ignorés. Mais, ils peuvent ne pas être trouvés et cela ne posera pas d'erreur. sys.path devrait seulement être ajouté aussi, pas soustrait. Django ne supprimerait pas les chemins.

1voto

Robin Macharg Points 45

L'ajout de la accepté de répondre et de répondre aux commentaires qui disent un module ne devrait pas supprimer des entrées de sys.path:

C'est globalement vrai, mais il y sont des circonstances ou vous pourriez vouloir modifier sys.path par la suppression d'entrées. Par exemple - et c'est spécifique à Mac; *nix/Windows corollaires peuvent exister - si vous en créer un sur mesure Python.framework pour les inclure dans votre propre projet, vous pouvez ignorer la valeur par défaut sys.path des entrées au point le système Python.framework.

Vous avez deux options:

  1. Hack de la site.py, comme @damirv indique, ou

  2. Ajoutez votre propre sitecustomize module (ou package) à la coutume cadre qui permet d'atteindre le même résultat final. Comme indiqué dans l' site.py des commentaires (pour 2.7.6, de toute façon):

    Après ces chemin des manipulations, une tentative est faite pour importer un module nommé sitecustomize, qui peuvent effectuer arbitraire supplémentaires site des personnalisations spécifiques. Si cette importation échoue avec une ImportError exception, il est ignoré en silence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X