agregando directorio a sys.path / PYTHONPATH

130

Estoy tratando de importar un módulo desde un directorio particular.

El problema es que si sys.path.append(mod_directory)añado la ruta y luego abro el intérprete de Python, el directorio mod_directoryse agrega al final de la lista sys.path. Si exporto la PYTHONPATHvariable antes de abrir el intérprete de Python, el directorio se agrega al comienzo de la lista. En el último caso, puedo importar el módulo, pero en el primero, no puedo.

¿Alguien puede explicar por qué sucede esto y darme una solución para agregarlo mod_directoryal inicio, dentro de un script de Python?

Imaginación no adulterada
fuente
He tratado sitemódulo .
Zeinab Abbasimazar

Respuestas:

178

Esto funciona según lo documentado. Todas las rutas especificadas en PYTHONPATHse documentan como normalmente después del directorio de trabajo pero antes de las rutas estándar proporcionadas por el intérprete. sys.path.append()se agrega a la ruta existente. Mira aquí y aquí . Si desea que un directorio en particular sea el primero, simplemente insértelo en la cabecera de sys.path:

import sys
sys.path.insert(0,'/path/to/mod_directory')

Dicho esto, generalmente hay mejores formas de administrar las importaciones que usarlas PYTHONPATHo manipularlas sys.pathdirectamente. Ver, por ejemplo, las respuestas a esta pregunta .

Ned Deily
fuente
gracias por la respuesta. El problema fue que no me di cuenta de que para agregar un módulo empaquetado como un archivo .egg, debe incluir el nombre de archivo en lugar de solo el directorio en python 2.6
UnadulteratedImagination
2
Hola hombre, esto rompió mi django. ¿Estás seguro de que quieres decirle a la gente que lo ponga en la parte superior?
R Claven
16
@RClaven, lo siento, es difícil decir a qué acción y resultados se refiere: "ponerlo en la parte superior" y "rompió mi django" no son muy precisos. ¿Puedes elaborar?
Ned Deily
Para obtener más información sobre cómo funciona sys.path, consulte esta respuesta stackoverflow.com/a/38403654/850326
djhaskin987
2
¡Realmente deberías usar "1" en lugar de "0"! De lo contrario, romperá sys.path . Consulte también stackoverflow.com/q/10095037/125507 .
kadee
9

Podrías usar:

import os
path = 'the path you want'
os.environ['PATH'] += ':'+path
Δημητρης Παππάς
fuente
necesitas ';' en ventanas
sanjivgupta
6

En cuanto a mí, necesito cuidar mi ruta de Python. Puedo agregar su ruta al archivo /home/xy/.bashrcagregando

export PYTHONPATH=/home/xy/caffe-master/python:$PYTHONPATH.

a mi /home/xy/.bashrcarchivo

Pero cuando uso pycharm, el camino todavía no está.

Entonces puedo agregar la ruta a la PYTHONPATHvariable, ejecutando -> editar configuración.

ingrese la descripción de la imagen aquí

Jayhello
fuente
La más simple es la mejor respuesta, agregar esto para el desarrollo hará que el autocompletado funcione
Gang
He actualizado el .bashrc como se explicó anteriormente, pero no lo reflejé en el cuaderno jupyter. El cuaderno Jupyter todavía dice que no se encontró el módulo.
Athar
3

Cambiar directorios temporalmente funciona bien para importar:

cwd = os.getcwd()
os.chdir(<module_path>)
import <module>
os.chdir(cwd)
usuario3517603
fuente
0

Al ejecutar un script de Python desde Powershell en Windows, esto debería funcionar:

$pathToSourceRoot = "C:/Users/Steve/YourCode"
$env:PYTHONPATH = "$($pathToSourceRoot);$($pathToSourceRoot)/subdirs_if_required"

# Now run the actual script
python your_script.py
Alexander Pacha
fuente