¿Cómo encuentro mi ruta de Python usando Python?

350

¿Cómo averiguo qué directorios figuran en la PYTHONPATHvariable de mi sistema , desde un script de Python (o el shell interactivo)?

Paul D. Waite
fuente
24
No estoy seguro de qué intenta hacer, pero si desea saber qué carpetas se utilizan para buscar los módulos que se importan, no debe confiar en ellas PYTHONPATH. Úselo sys.pathpara eso.
Vanuan
Por simple experimento, encontré la respuesta de Vanuan a continuación (imprimiendo sys.path) solo imprime PYTHONPATH. Esto funciona después de que alteramos el valor usando add_path (new_path) que se agrega a PYTHONPATH.
Chan Kim
66
El título de esta publicación y el cuerpo hacen dos preguntas diferentes. sys.pathes "Una lista de cadenas que especifica la ruta de búsqueda para módulos" - docs.python.org/2/library/sys.html#sys.path . PYTHONPATH es una variable de entorno que afecta a esta lista. Por cualquier definición razonable sys.pathes su "ruta de Python".
spinkus
44
No te olvides de eso python -m site.
Andrew McKinlay

Respuestas:

236

sys.pathpodría incluir elementos que no están específicamente en su PYTHONPATHvariable de entorno. Para consultar la variable directamente, use:

import os
try:
    user_paths = os.environ['PYTHONPATH'].split(os.pathsep)
except KeyError:
    user_paths = []
Mark Ransom
fuente
3
(o, más genéricamente ... split (os.sep)). No puedo entender por qué no estás recibiendo el amor, Mark. ¿Su respuesta es técnicamente más precisa que la respuesta de Paul D Waite a su pregunta?
mjv
55
os.sep es incorrecto, consulte stackoverflow.com/questions/1499019/…
Mark Ransom el
2
Y ese problema con el separador es probablemente por qué no estaba recibiendo el amor. Gracias por corregirme.
Mark Ransom
11
Y si recibo un KeyError, ¿significa que PYTHONPATH no está definido en mi sistema? ¿Es eso un problema? Gracias
glarrain
99
@glarrin, correcto: KeyError significa que PYTHONPATH no está definido. No será un problema porque ya hay rutas predeterminadas configuradas, vea sys.path.
Mark Ransom
600

Probablemente también quieras esto:

import sys
print(sys.path)

O como un trazador de líneas desde la terminal:

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

Advertencia : si tiene instaladas varias versiones de Python, debe usar el comando correspondiente python2o python3.

Vanuan
fuente
Mismo. Linux aaa.com 2.6.18-4-686-bigmem # 1 SMP mié 6 de junio 09:41:07 UTC 2007 i686 GNU / Linux ... Debian Sarge
Spechal
77
Esta es la forma independiente de la plataforma y el entorno para obtener la ruta actual de Python en tiempo de ejecución.
Dmitry Minkovsky
13
Esta respuesta fue mucho más útil para mi situación que la respuesta aceptada. Sé cuáles son mis variables de entorno. Necesitaba saber dónde Python decidió apuntar además de mi variable de entorno.
Vorticidad
Para Python 3:python -c "import sys; print('\n'.join(sys.path))"
mirceamironenco
@mirceamironenco cambió
Vanuan
10

Parece que no puedo editar la otra respuesta. Tiene un pequeño error en que es solo de Windows. La solución más genérica es usar os.sep como se muestra a continuación:

sys.path puede incluir elementos que no están específicamente en su variable de entorno PYTHONPATH. Para consultar la variable directamente, use:

import os
os.environ['PYTHONPATH'].split(os.pathsep)
Vitali
fuente
66
Para futuros lectores: os.sepdevuelve el separador de directorio para el sistema operativo, por ejemplo /. El separador utilizado en la ruta de Python es diferente y se devuelve os.pathsepcomo se muestra en la respuesta aceptada.
Paul D. Waite
3

PYTHONPATH es una variable de entorno cuyo valor es una lista de directorios. Una vez configurado, Python lo utiliza para buscar módulos importados, junto con otros estándares. y directorios de bibliotecas de terceros que figuran en "sys.path" de Python.

Como cualquier otra variable de entorno, puede exportarlo en shell o en ~ / .bashrc, consulte aquí . Puede consultar os.environ ['PYTHONPATH'] por su valor en Python como se muestra a continuación:

$ 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 se define en shell como

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

ENTONCES resultado =>

/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 resultado =>

PYTHONPATH is not defined

Para configurar PYTHONPATH en múltiples rutas, consulte aquí .

Tenga en cuenta que se puede agregar o eliminar una ruta de búsqueda a través de sys.path.insert (), del o remove () en tiempo de ejecución, pero NO a través de os.environ []. Ejemplo:

>>> 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 resumen, PYTHONPATH es una forma de especificar las rutas de búsqueda de Python para los módulos importados en sys.path. También puede aplicar operaciones de lista directamente a sys.path sin la ayuda de PYTHONPATH.

Leon Chang
fuente
0

Python me dice dónde vive cuando me da un mensaje de error :)

>>> 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
fuente
-1

Utilizar este:

import sys
print(sys.executable)

O una línea del cmd:

python -c "import sys; print(sys.executable)"
matan h
fuente
1
Parece que el autor de la pregunta está pidiendo la lista de directorios de Python, no la ruta al ejecutable real de Python.
Sergey Shubin