Comment puis-je trouver mon chemin python en utilisant python?

350

Comment savoir quels répertoires sont répertoriés dans la PYTHONPATHvariable de mon système , à partir d'un script Python (ou du shell interactif)?

Paul D. Waite
la source
24
Je ne sais pas trop ce que vous essayez de faire, mais si vous voulez savoir quels dossiers sont utilisés pour rechercher les modules importés, vous ne devriez pas vous fier à PYTHONPATH. Utilisez sys.pathpour cela.
Vanuan
Par simple expérience, j'ai trouvé la réponse de Vanuan ci-dessous (impression de sys.path) imprime simplement PYTHONPATH. Cela fonctionne après avoir modifié la valeur en utilisant add_path (new_path) qui ajoute à PYTHONPATH.
Chan Kim
6
Le titre de ce message et le corps posent deux questions différentes. sys.pathest "Une liste de chaînes qui spécifie le chemin de recherche des modules" - docs.python.org/2/library/sys.html#sys.path . PYTHONPATH est une variable d'environnement qui affecte cette liste. Par toute définition raisonnable sys.pathest votre "chemin python".
spinkus
4
N'oubliez pas python -m site.
Andrew McKinlay

Réponses:

236

sys.pathpeut inclure des éléments qui ne sont pas spécifiquement dans votre PYTHONPATHvariable d'environnement. Pour interroger directement la variable, utilisez:

import os
try:
    user_paths = os.environ['PYTHONPATH'].split(os.pathsep)
except KeyError:
    user_paths = []
Mark Ransom
la source
3
(ou, plus génériquement ... split (os.sep)). Je n'arrive pas à comprendre pourquoi tu n'obtiens pas l'amour, Mark. Votre réponse est techniquement plus précise que la réponse de Paul D Waite à sa question ????
mjv
5
os.sep est incorrect, voir stackoverflow.com/questions/1499019/…
Mark Ransom
2
Et ce problème avec le séparateur est probablement la raison pour laquelle je n'ai pas eu l'amour. Merci de m'avoir corrigé.
Mark Ransom
11
Et si je reçois une erreur de clé, cela signifie-t-il que PYTHONPATH n'est pas défini dans mon système? Est-ce un problème? Merci
glarrain
9
@glarrin, correct - KeyError signifie que PYTHONPATH n'est pas défini. Ce ne sera pas un problème car il y a déjà des chemins par défaut configurés, voir sys.path.
Mark Ransom
600

Vous voudriez probablement aussi ceci:

import sys
print(sys.path)

Ou comme un seul paquebot depuis le terminal:

python -c "import sys; print('\n'.join(sys.path))"

Avertissement : si plusieurs versions de Python sont installées, vous devez utiliser une commande correspondante python2ou python3.

Vanuan
la source
Même. Linux aaa.com 2.6.18-4-686-bigmem # 1 SMP mer 6 juin 09:41:07 UTC 2007 i686 GNU / Linux ... Debian Sarge
Spechal
7
C'est le moyen indépendant de la plate-forme et de l'environnement pour obtenir le chemin python du runtime actuel.
Dmitry Minkovsky
13
Cette réponse était beaucoup plus utile pour ma situation que la réponse acceptée. Je sais quelles sont mes variables d'environnement. J'avais besoin de savoir où python a décidé de pointer en plus de ma variable d'environnement.
Vorticity
Pour Python 3:python -c "import sys; print('\n'.join(sys.path))"
mirceamironenco
@mirceamironenco a changé
Vanuan
10

Impossible de modifier l'autre réponse. A une erreur mineure en ce qu'il est uniquement Windows. La solution la plus générique consiste à utiliser os.sep comme ci-dessous:

sys.path peut inclure des éléments qui ne sont pas spécifiquement dans votre variable d'environnement PYTHONPATH. Pour interroger directement la variable, utilisez:

import os
os.environ['PYTHONPATH'].split(os.pathsep)
Vitali
la source
6
Pour les futurs lecteurs: os.seprenvoie le séparateur de répertoire pour le système d'exploitation, par exemple /. Le séparateur utilisé dans le chemin Python est différent et renvoyé par os.pathsepcomme indiqué dans la réponse acceptée.
Paul D. Waite
3

PYTHONPATH est une variable d'environnement dont la valeur est une liste de répertoires. Une fois défini, il est utilisé par Python pour rechercher des modules importés, ainsi que d'autres std. et les répertoires de bibliothèques tierces répertoriés dans "sys.path" de Python.

Comme toute autre variable d'environnement, vous pouvez l'exporter en shell ou en ~ / .bashrc, voir ici . Vous pouvez interroger os.environ ['PYTHONPATH'] pour sa valeur en Python comme indiqué ci-dessous:

$ python3 -c "import os, sys; print(os.environ['PYTHONPATH']); print(sys.path) if 'PYTHONPATH' in sorted(os.environ) else print('PYTHONPATH is not defined')"

SI défini dans le shell comme

$ export PYTHONPATH=$HOME/Documents/DjangoTutorial/mysite

ALORS résultat =>

/home/Documents/DjangoTutorial/mysite
['', '/home/Documents/DjangoTutorial/mysite', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']

ELSE résultat =>

PYTHONPATH is not defined

Pour définir PYTHONPATH sur plusieurs chemins, voir ici .

Notez que l'on peut ajouter ou supprimer un chemin de recherche via sys.path.insert (), del ou remove () au moment de l'exécution, mais PAS via os.environ []. Exemple:

>>> os.environ['PYTHONPATH']="$HOME/Documents/DjangoTutorial/mysite"
>>> 'PYTHONPATH' in sorted(os.environ)
True
>>> sys.path // but Not there
['', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']

>>> sys.path.insert(0,os.environ['PYTHONPATH'])
>>> sys.path // It's there
['$HOME/Documents/DjangoTutorial/mysite', '', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']
>>> 

En résumé, PYTHONPATH est un moyen de spécifier le ou les chemins de recherche Python pour les modules importés dans sys.path. Vous pouvez également appliquer des opérations de liste directement à sys.path sans l'aide de PYTHONPATH.

Leon Chang
la source
0

Python me dit où il vit quand il me donne un message d'erreur :)

>>> import os
>>> os.environ['PYTHONPATH'].split(os.pathsep)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\martin\AppData\Local\Programs\Python\Python36-32\lib\os.py", line 669, in __getitem__
    raise KeyError(key) from None
KeyError: 'PYTHONPATH'
>>>
C4rnot
la source
-1

Utilisez ceci:

import sys
print(sys.executable)

Ou une ligne du cmd:

python -c "import sys; print(sys.executable)"
matan h
la source
1
Il semble que l'auteur de la question demande la liste des répertoires python et non le chemin vers l'exécutable python réel.
Sergey Shubin