web-dev-qa-db-fra.com

D'où est initialisé sys.path de Python?

D'où est initialisé sys.path de Python?

UPD : Python ajoute des chemins avant de faire référence à PYTHONPATH:

    >>> import sys
    >>> from pprint import pprint as p
    >>> p(sys.path)
    ['',
     'C:\\Python25\\lib\\site-packages\\setuptools-0.6c9-py2.5.Egg',
     'C:\\Python25\\lib\\site-packages\\orbited-0.7.8-py2.5.Egg',
     'C:\\Python25\\lib\\site-packages\\morbid-0.8.6.1-py2.5.Egg',
     'C:\\Python25\\lib\\site-packages\\demjson-1.4-py2.5.Egg',
     'C:\\Python25\\lib\\site-packages\\stomper-0.2.2-py2.5.Egg',
     'C:\\Python25\\lib\\site-packages\\uuid-1.30-py2.5.Egg',
     'C:\\Python25\\lib\\site-packages\\stompservice-0.1.0-py2.5.Egg',
     'C:\\Python25\\lib\\site-packages\\cherrypy-3.0.1-py2.5.Egg',
     'C:\\Python25\\lib\\site-packages\\pyorbited-0.2.2-py2.5.Egg',
     'C:\\Python25\\lib\\site-packages\\flup-1.0.1-py2.5.Egg',
     'C:\\Python25\\lib\\site-packages\\wsgilog-0.1-py2.5.Egg',
     'c:\\testdir',
     'C:\\Windows\\system32\\python25.Zip',
     'C:\\Python25\\DLLs',
     'C:\\Python25\\lib',
     'C:\\Python25\\lib\\plat-win',
     'C:\\Python25\\lib\\lib-tk',
     'C:\\Python25',
     'C:\\Python25\\lib\\site-packages',
     'C:\\Python25\\lib\\site-packages\\PIL',
     'C:\\Python25\\lib\\site-packages\\win32',
     'C:\\Python25\\lib\\site-packages\\win32\\lib',
     'C:\\Python25\\lib\\site-packages\\Pythonwin']

Mon PYTHONPATH est:

    PYTHONPATH=c:\testdir

Je me demande d'où viennent ces chemins antérieurs à ceux de PYTHONPATH?

94
Alex

"Initialisé à partir de la variable d'environnement PYTHONPATH, plus une valeur par défaut dépendante de l'installation"

- http://docs.python.org/library/sys.html#sys.path

44
dfa

Python essaie vraiment de définir intelligemment sys.path . Comment cela est mis peut obtenir vraimentcompliqué . Le guide suivant est un guide dilué, quelque peu incomplet, quelque peu faux, mais utile, à l’avenir, pour le python) programmeur de ce qui se passe lorsque python indique ce qu'il faut utiliser comme valeurs initiales de sys.path, sys.executable, sys.exec_prefix, et sys.prefix sur une installation normale python.

Premièrement, python fait de son mieux pour déterminer son emplacement physique réel sur le système de fichiers en fonction de ce que le système d'exploitation lui indique. Si le système d'exploitation dit simplement que "python" est en cours d'exécution, il se trouvera dans $ PATH. Il résout tous les liens symboliques. Une fois que cela est fait, le chemin de l'exécutable trouvé est utilisé comme valeur pour sys.executable, Pas de ifs, ni de mais.

Ensuite, il détermine les valeurs initiales pour sys.exec_prefix Et sys.prefix.

Si un fichier appelé pyvenv.cfg Se trouve dans le même répertoire que sys.executable Ou dans un répertoire supérieur, python l'examine. Différents systèmes d'exploitation agissent différemment avec ce fichier. .

L'une des valeurs de ce fichier de configuration que python recherche est l'option de configuration home = <DIRECTORY>. Python utilisera ce répertoire à la place du répertoire contenant sys.executable lorsqu’il définit dynamiquement la valeur initiale de sys.prefix ultérieurement. Si le paramètre applocal = true apparaît dans le fichier pyvenv.cfg sous Windows, mais pas le paramètre home = <DIRECTORY>, Alors sys.prefix Sera défini sur le répertoire contenant sys.executable.

Ensuite, la variable d’environnement PYTHONHOME est examinée. Sous Linux et Mac, sys.prefix Et sys.exec_prefix Sont définis sur la variable d’environnement PYTHONHOME, si elle existe, remplaçant tout paramètre home = <DIRECTORY> dans pyvenv.cfg. Sous Windows, sys.prefix Et sys.exec_prefix Sont définis sur la variable d’environnement PYTHONHOME, si elle existe, , sauf si un paramètre home = <DIRECTORY> est présent dans pyvenv.cfg, qui est utilisé à la place.

Sinon, ces sys.prefix Et sys.exec_prefix Sont trouvés en remontant à partir de l'emplacement de sys.executable, Ou du répertoire home donné par pyvenv.cfg Si tout.

Si le fichier lib/python<version>/dyn-load Se trouve dans ce répertoire ou dans l'un de ses répertoires parents, ce répertoire est configuré pour être sys.exec_prefix Sous Linux ou Mac. Si le fichier lib/python<version>/os.py Se trouve dans le répertoire ou dans l’un de ses sous-répertoires, il est défini sur sys.prefix Sous Linux, Mac et Windows, avec sys.exec_prefix Sur la même valeur que sys.prefix sous Windows. Toute cette étape est ignorée sous Windows si applocal = true Est défini. Le répertoire de sys.executable Est utilisé ou, si home est défini dans pyvenv.cfg, Il est utilisé à la place pour la valeur initiale de sys.prefix.

S'il ne trouve pas ces fichiers "historiques" ou si sys.prefix N'a pas encore été trouvé, python définit sys.prefix Sur une valeur "de secours". Linux et Mac, par exemple, utilisent des valeurs pré-compilées comme valeurs de sys.prefix Et sys.exec_prefix. Windows attend que sys.path Soit complètement défini pour définir une valeur de repli pour sys.prefix.

Ensuite, (ce que vous attendiez tous) python détermine les valeurs initiales devant figurer dans sys.path.

  1. Le répertoire du script que python est en cours d'exécution est ajouté à sys.path. Sous Windows, il s'agit toujours de la chaîne vide qui indique python d'utiliser le chemin complet où se trouve le script.
  2. Le contenu de la variable d’environnement PYTHONPATH, s’il est défini, est ajouté à sys.path, sauf si vous êtes sous Windows et applocal est défini sur true dans pyvenv.cfg.
  3. Le chemin du fichier Zip, qui est <prefix>/lib/python35.Zip Sous Linux/Mac et os.path.join(os.dirname(sys.executable), "python.Zip") sous Windows, est ajouté à sys.path.
  4. Si sous Windows et que applocal = true N'est pas défini dans pyvenv.cfg, Le contenu des sous-clés de la clé de registre HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ Est ajouté, le cas échéant.
  5. Si sous Windows et que applocal = true N'était pas défini dans pyvenv.cfg Et que sys.prefix Était introuvable, le contenu de base de la clé de registre HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ est ajouté, s'il existe;
  6. Si sous Windows et que applocal = true N'est pas défini dans pyvenv.cfg, Le contenu des sous-clés de la clé de registre HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\ Est ajouté, le cas échéant.
  7. Si sous Windows et que applocal = true N'était pas défini dans pyvenv.cfg Et que sys.prefix Était introuvable, le contenu de base de la clé de registre HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ est ajouté, s'il existe;
  8. Si sous Windows et que PYTHONPATH n'était pas défini, que le préfixe était introuvable et qu'aucune clé de registre n'était présente, la valeur relative de PYTHONPATH au moment de la compilation est ajoutée; sinon, cette étape est ignorée.
  9. Les chemins de la macro de compilation PYTHONPATH sont ajoutés par rapport à la recherche dynamique sys.prefix.
  10. Sur Mac et Linux, la valeur de sys.exec_prefix Est ajoutée. Sous Windows, le répertoire utilisé (ou l'aurait été) pour rechercher dynamiquement sys.prefix Est ajouté.

A ce stade de Windows, si aucun préfixe n’a été trouvé, python va essayer de le déterminer en cherchant tous les les répertoires dans sys.path pour les fichiers de repère, comme cela avait été tenté auparavant avec le répertoire de sys.executable, jusqu'à ce qu'il trouve quelque chose. Sinon, sys.prefix est laissé vide. .

Enfin, après tout cela, Python charge le module site, qui ajoute encore des éléments à sys.path:

Il commence par construire jusqu'à quatre répertoires à partir d'une tête et d'une queue. Pour la partie tête, il utilise sys.prefix Et sys.exec_prefix; les têtes vides sont ignorées. Pour la partie queue, il utilise la chaîne vide, puis lib/site-packages (Sous Windows) ou lib/pythonX.Y/site-packages, Puis lib/site-python (Sous Unix et Macintosh). Pour chacune des combinaisons tête-queue distinctes, il voit s'il fait référence à un répertoire existant et, le cas échéant, l'ajoute à sys.path et examine également le chemin nouvellement ajouté pour les fichiers de configuration.

63
djhaskin987