En el script Python, ¿cómo configuro PYTHONPATH?

115

Sé cómo configurarlo en mi / etc / profile y en mis variables de entorno.

Pero, ¿y si quiero configurarlo durante un script? ¿Es import os, sys? ¿Cómo lo hago?

TIMEX
fuente

Respuestas:

192

No configura PYTHONPATH, agrega entradas a sys.path. Es una lista de directorios en los que se deben buscar paquetes de Python, por lo que puede agregar sus directorios a esa lista.

sys.path.append('/path/to/whatever')

De hecho, sys.pathse inicializa dividiendo el valor de PYTHONPATHen el carácter separador de ruta ( :en sistemas similares a Linux, ;en Windows).

También puede agregar directorios usando site.addsitedir, y ese método también tendrá en cuenta los .ptharchivos existentes dentro de los directorios que pase. (Ese no sería el caso con los directorios que especifique PYTHONPATH).

David Z
fuente
11
Han pasado muchos años desde que se publicó esta respuesta, pero aún quiero agregar que si desea asegurarse de que Python verifique el nuevo directorio antes que todos los demás al importar, debe colocar el nuevo directorio primero en la lista, ya que en sys.path.insert(0, '/path/to/whatever').
wecsam
39

Puede obtener y establecer variables de entorno a través de os.environ:

import os
user_home = os.environ["HOME"]

os.environ["PYTHONPATH"] = "..."

Pero como su intérprete ya se está ejecutando, esto no tendrá ningún efecto. Es mejor usar

import sys
sys.path.append("...")

que es la matriz en la que PYTHONPATHse transformará al iniciar el intérprete.

miku
fuente
18

Si pones sys.path.append('dir/to/path')sin marcar que ya está agregado, podrías generar una lista larga en formato sys.path. Para eso, recomiendo esto:

import sys
import os # if you want this directory

try:
    sys.path.index('/dir/path') # Or os.getcwd() for this directory
except ValueError:
    sys.path.append('/dir/path') # Or os.getcwd() for this directory
Francisco Manuel Garca Botella
fuente
2
Agradable. Muy pitónico.
PartialOrder
1
¿Cómo puedo vaciar PythonPath? No quiero agregar. Quiero vaciarlo y poner lo que solo quiero adentro. ¿Hay alguna forma de hacer esto?
Schütze
¿Intentó reinicializarlo llamando a sys.path .__ init __ ()? Esto debería vaciar la ruta de Python. Espero que esto ayude.
Thayz
@ francisco-manuel-garca-botella ¡Responder a viejas preguntas es muy bienvenido en este sitio! Nada que lamentar.
user7610
No estoy de acuerdo con que esto sea pitónico, y sugeriría que no es un buen enfoque de programación. El manejo de excepciones es muy caro cuando ocurre la excepción, por lo que no querrá usarlo para reemplazar una instrucción "if" donde es muy posible que use el else. Un simple if 'mypath' en sys.path ... else ... sería mi consejo.
markgalassi
6

PYTHONPATH termina en sys.path , que puede modificar en tiempo de ejecución.

import sys
sys.path += ["whatever"]
unbeli
fuente
¿Hay alguna razón para preferir esta respuesta a la de @DavidZ?
Dror
Al menos, es menos detallado.
tripleee
-1

puede configurar PYTHONPATH, por os.environ['PATHPYTHON']=/some/path, luego debe llamar os.system('python')para reiniciar el shell de Python para que la ruta recién agregada sea efectiva.

tesla1060
fuente
1
os.system()no "reinicia el shell de Python", inicia una nueva instancia interactiva de Python. Cuando regrese de eso, estará de vuelta en el guión de llamada.
tripleee
-2

Linux esto también funciona:

import sys
sys.path.extend(["/path/to/dotpy/file/"])
lashgar
fuente