web-dev-qa-db-fra.com

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

Quand je cours

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.Egg 
 ... 
/Library/Python/2.6/site-packages/ipython -0.10.1-py2.6.Egg 
/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/plat-darwin[.____.[/System/Library/Frameworks /Python.framework/Versions/2.6/lib/python2.6/plat-mac[.____.[/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac/lib- packages de scripts 
 
/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-old[.____. E5E/System/Library/Frameworks /Python.framework/Versions/2.6/lib/python2.6/lib-dynload[.____.[/Library/Python/2.6/site-packages[.____.[/System/Library/Framew orks/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 

Ils sont regroupés en 5 catégories.

  • /Library/Python/2.6/site-packages/*.Egg
  • /Library/Python/2.6/site-packages
  • Frameworks/Python.framework/Versions/2.6/lib/python2.6
  • Frameworks/Python.framework/Versions/2.6/Extras/lib/python
  • PATH à partir de la variable d'environnement PYTHONPATH.

Et je peux ajouter plus de chemins en utilisant le code

sys.path.insert(0, MORE_PATH)
  • Quelles routines établissent ces chemins et quand?
  • Certains des chemins sont-ils construits en python code source?
  • Est-il possible que les chemins insérés avec 'sys.path.insert' soient ignorés? Je suis curieux à ce sujet, car avec mod_wsgi, j'ai trouvé que les chemins ne sont pas trouvés avec 'sys.path.insert'. J'ai demandé n autre message pour cette question.

AJOUTÉE

Sur la base de la réponse de Michael, j'ai examiné site.py et j'ai obtenu 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 également que le nom du répertoire qui contient site.py (/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6 pour mon Mac) devrait être intégré à Python = code source.

64
prosseek

La plupart des éléments sont configurés dans site.py De Python qui est automatiquement importé au démarrage de l'interpréteur (sauf si vous le démarrez avec l'option -S). Peu de chemins sont configurés dans l'interpréteur lui-même lors de l'initialisation (vous pouvez le découvrir en commençant python avec -S)).

De plus, certains frameworks (comme Django je pense) modifient sys.path Au démarrage pour répondre à leurs besoins.

Le module site a un assez bon documentation , un commentaire code source et affiche quelques informations si vous l'exécutez via python -m site.

25
Michael

De Apprentissage de Python:

sys.path est le chemin de recherche du module. Python le configure au démarrage du programme, fusionnant automatiquement le répertoire personnel du fichier de niveau supérieur (ou une chaîne vide pour désigner le répertoire de travail actuel), tous les répertoires PYTHONPATH, le contenu de tout - . pth les chemins de fichiers que vous avez créés et les répertoires de bibliothèque standard. Le résultat est une liste de chaînes de noms de répertoires qui Python recherche à chaque importation d'un nouveau fichier.

12
Andrew Clark

site.py est en effet les réponses. Je voulais supprimer toutes les dépendances de l'ancien Python qui est installé par défaut sur mon mac. Cela fonctionne plutôt bien, car 'site.py' est appelé à chaque fois que le python est démarré.

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)
6
damirv

Le chemin a ces parties:

  • Chemins d'OS contenant vos bibliothèques système
  • répertoire courant python démarré à 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 déclenchera pas d'erreur. sys.path ne doit être ajouté que trop, pas soustrait de. Django ne supprimerait pas les chemins.

4
nate c

Notez également: si la variable PYTHONHOME env est définie, les bibliothèques standard seront chargées à partir de ce chemin au lieu de la valeur par défaut, comme documenté .

Ce n'est pas une réponse directe à la question, mais quelque chose que je viens de découvrir qui provoquait le chargement des mauvaises bibliothèques standard, et mes recherches m'ont conduit ici en cours de route.

1
Gilly

Vous utilisez le système python /usr/bin/python.

sys.path est défini à partir des fichiers système au démarrage python.

Ne touchez pas ces fichiers, en particulier site.py, car cela pourrait perturber le système.

Cependant, vous pouvez changer sys.path en python, en particulier au démarrage:

dans ~/.bashrc ou ~/.zshrc:

export PYTHONSTARTUP=~/.pythonrc

dans ~/.pythonrc:

écrivez vos modifications dans sys.path.

Ces modifications seront uniquement pour vous dans des shells interactifs.

Pour le piratage à faible risque pour le système, installez votre propre version python).

1
Pierre ALBARÈDE

Ajout à la réponse acceptée et réponse aux commentaires qui disent qu'un module ne doit pas supprimer les entrées de sys.path:

C'est généralement vrai, mais il y a existe circonstances dans lesquelles vous voudrez peut-être modifier sys.path En supprimant les entrées. Par exemple - et ceci est spécifique à Mac; * Des corollaires nix/Windows peuvent exister - si vous créez un Python.framework personnalisé à inclure dans votre propre projet, vous souhaiterez peut-être ignorer les entrées par défaut sys.path qui pointent vers le système Python.framework .

Vous avez plusieurs options:

  1. Piratez le site.py, Comme @damirv l'indique, ou

  2. Ajoutez votre propre module (ou package) sitecustomize au framework personnalisé qui obtient le même résultat final. Comme indiqué dans les commentaires site.py (Pour 2.7.6, de toute façon):

    Après ces manipulations de chemin, une tentative est effectuée pour importer un module nommé sitecustomize, qui peut effectuer des personnalisations supplémentaires spécifiques au site arbitraires. Si cette importation échoue avec une exception ImportError, elle est silencieusement ignorée.

1
Robin Macharg