Come faccio a scoprire il mio percorso Python usando Python?


350

Come faccio a sapere quali directory sono elencate nella PYTHONPATHvariabile del mio sistema , all'interno di uno script Python (o della shell interattiva)?


24
Non sono sicuro di cosa stai cercando di fare, ma se vuoi sapere quali cartelle vengono utilizzate per cercare i moduli da importare, non dovresti fare affidamento PYTHONPATH. Usa sys.pathper quello.
Vanuan,

Con un semplice esperimento, ho trovato la risposta di Vanuan di seguito (stampa di sys.path) che stampa PYTHONPATH. Funziona dopo aver modificato il valore utilizzando add_path (new_path) che aggiunge a PYTHONPATH.
Chan Kim,

6
Il titolo di questo post e il corpo pongono due domande diverse. sys.pathè "Un elenco di stringhe che specifica il percorso di ricerca dei moduli" - docs.python.org/2/library/sys.html#sys.path . PYTHONPATH è una variabile d'ambiente che influenza questo elenco. Secondo una definizione ragionevole sys.pathè il tuo "percorso pitone".
spinkus,

4
Non dimenticartene python -m site.
Andrew McKinlay,

Risposte:


236

sys.pathpotrebbe includere elementi che non sono specificamente nella PYTHONPATHvariabile di ambiente. Per interrogare direttamente la variabile, utilizzare:

import os
try:
    user_paths = os.environ['PYTHONPATH'].split(os.pathsep)
except KeyError:
    user_paths = []

3
(o, più genericamente ... split (os.sep)). Non riesco a capire perché non stai ricevendo l'amore, Mark. La tua risposta è tecnicamente più accurata della risposta di Paul D Waite alla sua domanda ????
mjv,

5
os.sep non è corretto, consultare stackoverflow.com/questions/1499019/…
Mark Ransom,

2
E quel problema con il separatore è probabilmente il motivo per cui non stavo ottenendo l'amore. Grazie per avermi chiarito.
Mark Ransom,

11
E se ricevere un KeyError, significa che PYTHONPATH non è definito nel mio sistema? È un problema? Grazie
glarrain,

9
@glarrin, correct - KeyError significa che PYTHONPATH non è definito. Non sarà un problema perché ci sono già percorsi predefiniti impostati, vedi sys.path.
Mark Ransom,

600

Probabilmente vorrai anche questo:

import sys
print(sys.path)

O come una fodera dal terminal:

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

Avvertenza : se sono installate più versioni di Python, è necessario utilizzare un comando corrispondente python2o python3.


Stesso. Linux aaa.com 2.6.18-4-686-bigmem # 1 SMP mer 6 giu 09:41:07 UTC 2007 i686 GNU / Linux ... Debian Sarge
Spechal

7
Questo è il modo indipendente dalla piattaforma e dall'ambiente per ottenere il percorso python del runtime corrente.
Dmitry Minkovsky,

13
Questa risposta è stata molto più utile per la mia situazione rispetto alla risposta accettata. So quali sono le mie variabili di ambiente. Avevo bisogno di sapere dove Python ha deciso di puntare oltre alla mia variabile d'ambiente.
Vorticità

Per Python 3:python -c "import sys; print('\n'.join(sys.path))"
mirceamironenco,

@mirceamironenco è cambiato
Vanuan

10

Non riesco a modificare l'altra risposta. Ha un errore minore in quanto è solo per Windows. La soluzione più generica è utilizzare os.sep come di seguito:

sys.path potrebbe includere elementi che non sono specificamente nella variabile di ambiente PYTHONPATH. Per interrogare direttamente la variabile, utilizzare:

import os
os.environ['PYTHONPATH'].split(os.pathsep)

6
Per i lettori futuri: os.seprestituisce il separatore di directory per il sistema operativo, ad es /. Il separatore utilizzato nel percorso Python è diverso e restituito os.pathsepcome mostrato nella risposta accettata.
Paul D. Waite,

3

PYTHONPATH è una variabile d'ambiente il cui valore è un elenco di directory. Una volta impostato, viene utilizzato da Python per cercare moduli importati, insieme ad altri standard. e directory di librerie di terze parti elencate in "sys.path" di Python.

Come qualsiasi altra variabile d'ambiente, puoi esportarla in shell o in ~ / .bashrc, vedi qui . Puoi eseguire una query su os.environ ['PYTHONPATH'] per il suo valore in Python come mostrato di seguito:

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

Se definito nella shell come

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

POI risultato =>

/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']

Risultato ELSE =>

PYTHONPATH is not defined

Per impostare PYTHONPATH su più percorsi, vedere qui .

Si noti che è possibile aggiungere o eliminare un percorso di ricerca tramite sys.path.insert (), del o remove () in fase di esecuzione, ma NON tramite os.environ []. Esempio:

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

In breve, PYTHONPATH è un modo per specificare i percorsi di ricerca Python per i moduli importati in sys.path. È inoltre possibile applicare le operazioni dell'elenco direttamente a sys.path senza l'aiuto di PYTHONPATH.


0

Python mi dice dove vive quando mi dà un messaggio di errore :)

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

-1

Usa questo:

import sys
print(sys.executable)

O una riga dal cmd:

python -c "import sys; print(sys.executable)"

1
Sembra che l'autore della domanda stia chiedendo l'elenco delle directory di Python e non il percorso del vero eseguibile di Python.
Sergey Shubin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.