¿Agregar permanentemente un directorio a PYTHONPATH?

324

Cada vez que uso sys.path.append, se agregará el nuevo directorio. Sin embargo, una vez que cierre Python, la lista volverá a los valores anteriores (¿predeterminados?). ¿Cómo agrego permanentemente un directorio PYTHONPATH?

John Howard
fuente

Respuestas:

135

Debe agregar su nuevo directorio a la variable de entorno PYTHONPATH, separado por dos puntos del contenido anterior del mismo. En cualquier forma de Unix, puede hacerlo en un script de inicio apropiado para cualquier shell que esté usando ( .profileo lo que sea, dependiendo de su shell favorito) con un comando que, nuevamente, depende del shell en cuestión; en Windows, puede hacerlo a través de la GUI del sistema para tal fin.

superuser.com puede ser un mejor lugar para preguntar más, es decir, para obtener más detalles si necesita detalles sobre cómo enriquecer una variable de entorno en su plataforma y shell elegidos, ya que no es realmente una pregunta de programación per se.

Alex Martelli
fuente
8
Errata: separador en windows sería un punto y coma. Si necesita anular las rutas del sistema en Windows, la configuración a través de la GUI como una variable de entorno del usuario puede no ser suficiente, ya que las variables del usuario se agregan a las variables del sistema. En estos casos, deberá recurrir a un script de inicio que realice los ajustes necesarios.
Nathan Ernst
1
@ Nathan, tx para el recordatorio de punto y coma, pero (si usted es un administrador, por supuesto) se puede configurar el sistema env.vars en las ventanas (además, el PO no está pidiendo la manera de anular el camino, cuán a anexar a ella , entonces, ¡un usuario env.var también estará bien para eso! -).
Alex Martelli el
desafortunadamente no soy administrador en mi PC de trabajo, así que tengo que recurrir a tales medidas. :(
Nathan Ernst
439

Si está utilizando bash (en una distribución Mac o GNU / Linux), agregue esto a su ~/.bashrc

export PYTHONPATH="${PYTHONPATH}:/my/other/path"
awesomo
fuente
28
Esto funcionó perfectamente para mí, pero asegúrese de que el directorio al que apunta tenga el archivo init .py más alto en la estructura de su directorio. Esto no estaba perfectamente claro para mí al principio. Por ejemplo, intenté exportar PYTHONPATH = $ PYTHONPATH: / Users / joey / repos pero no funcionó porque mi directorio repos no tenía _ init_ .py. Bajando un directorio más allá: / Users / joey / repos / specificRepo hizo el truco. ¡Ahora Python puede atravesar cualquier directorio descendente conectado al directorio específico Repo que contiene un init .py!
Qiao Yi
3
esto funcionó para mí, pero ¿podría explicar dónde se encuentra esta variable PYTHONPATH? ¿Y cómo sabe "exportar PYTHONPATH" para localizar ese archivo exacto?
appleLover
42
recuerde después de editar, ~/.bashrcluego ejecute source ~/.bashrcver stackoverflow.com/questions/2518127/…
b_dev
2
Creo que es una mala idea poner sudo sual comienzo de su archivo .bashrc. Esta publicación está de acuerdo conmigo. En mi sistema, al menos, ni siquiera es necesario.
LondonRob
Esta es la respuesta.
Aerin
88

En lugar de manipular PYTHONPATH, también puede crear un archivo de configuración de ruta . Primero descubra en qué directorio Python busca esta información:

python -m site --user-site

Por alguna razón, esto no parece funcionar en Python 2.7. Allí puedes usar:

python -c 'import site; site._script()' --user-site

Luego cree un .ptharchivo en ese directorio que contenga la ruta que desea agregar (cree el directorio si no existe).

Por ejemplo:

# find directory
SITEDIR=$(python -m site --user-site)

# create if it doesn't exist
mkdir -p "$SITEDIR"

# create new .pth file with our path
echo "$HOME/foo/bar" > "$SITEDIR/somelib.pth"
algo
fuente
He intentado esto usando Python 2.6 y no parece funcionar para mí
Lorcan O'Neill
44
Acabo de vincular este directorio a mi propio directorio de bibliotecas y almacenar todas mis secuencias de comandos allí. Funcionó bien.
firesofmay
¡Decidí intentarlo nuevamente después de encontrar este tema nuevamente y logré hacerlo funcionar como esta vez! Upvoted y contrito disculpas :)
Lorcan O'Neill
Esto funciona perfectamente, estaba en el camino correcto, pero las partes python -m site --user-sitey (create the directory if it doesn't exist)eran lo que me faltaba para que funcionara.
Aurélien Ooms
1
¿Debo dar un paso adicional para que Python reconozca la ruta agregada somelib.pth? Si no, ¿adivina por qué esto podría no funcionar?
Miladiouss
38

Esto funciona en Windows

  1. En Windows, con Python 2.7, vaya a la carpeta de configuración de Python.
  2. Abra Lib / paquetes de sitio.
  3. Agregue un archivo vacío example.pth a esta carpeta.
  4. Agregue la ruta requerida al archivo, una por cada línea.

Entonces podrá ver todos los módulos dentro de esas rutas desde sus scripts.

auserdude
fuente
3
En mi opinión, esta es la mejor solución, ya que no depende de la elección del shell o el entorno de trabajo. También funciona en Linux, donde la ruta predeterminada de Python es "/usr/local/lib/pythonX.Y/site-packages". Si eso no funciona, intente colocar su archivo .pth en el directorio dist-packages.
matus
1
Windows 7, Python 3.6.5. Esta es la respuesta. Como auserdude escribió: Cree el "ejemplo.pth" en la carpeta Lib / site-packages de Python y luego agregue su ruta de la siguiente manera: C: \ somefolder \ anotherfolder \ targetfolder
JayJay123
excelente respuesta, también funciona con python 3.7 en Windows 10, mi ruta de Windows 10 es: "C: \ Users \ {usrName} \ AppData \ Local \ Programs \ Python \ Python37-32 \ Lib"
Ali80
Puede confirmar que funciona para Python 3.6.7 en Windows 10. Sin embargo, tenga en cuenta que la ruta se adjunta a su PYTHONPATH con significa que su módulo adjunto no se encontrará en el caso de una colisión de nombres.
BramAppel
25

En caso de que alguien siga confundido, si está en una Mac, haga lo siguiente:

  1. Abrir terminal
  2. Tipo open .bash_profile
  3. En el archivo de texto que aparece, agregue esta línea al final: export PYTHONPATH=$PYTHONPATH:foo/bar
  4. Guarde el archivo, reinicie la Terminal y listo
entrepaul
fuente
2
Cualquiera que se pregunte cómo ver la ruta de Python, use: which python
Arindam Roychowdhury
bastante seguro de que necesita recargar la terminal también
Usuario
en realidad la exportclave era lo que me faltaba !!!!, voté, muchas gracias!
a_m_dev
21

Puede agregar la ruta a través de su archivo pythonrc, que por defecto es ~ / .pythonrc en Linux. es decir.

import sys
sys.path.append('/path/to/dir')

También puede establecer la PYTHONPATHvariable de entorno, en un archivo rc global, como ~/.profileen mac o linux, o mediante el Panel de control -> Sistema -> pestaña Avanzado -> Variables de entorno en windows.

Pimientos azules
fuente
40
sys.path.append ('/ path / to / dir') no agrega permanentemente la entrada.
jeremyjjbrown
15

Para dar un poco más de explicación, Python construirá automáticamente sus rutas de búsqueda (como se mencionó anteriormente y aquí ) utilizando el site.pyscript (normalmente ubicado en sys.prefix + lib/python<version>/site-packagesy también lib/site-python). Se puede obtener el valor de sys.prefix:

python -c 'import sys; print(sys.prefix)'

El script site.py luego agrega una serie de directorios, dependiendo de la plataforma, como /usr/{lib,share}/python<version>/dist-packages, /usr/local/lib/python<version>/dist-packagesa la ruta de búsqueda y también busca en estas rutas <package>.ptharchivos de configuración que contengan rutas de búsqueda adicionales específicas. Por ejemplo, easy-install mantiene su colección de paquetes instalados que se agregan a un archivo específico del sistema, por ejemplo, en Ubuntu /usr/local/lib/python2.7/dist-packages/easy-install.pth. En un sistema típico, hay un montón de estos archivos .pth que pueden explicar algunas rutas inesperadas en sys.path:

python -c 'import sys; print(sys.path)'

Por lo tanto, se puede crear un archivo .pth y colocarlo en cualquiera de estos directorios (incluido el sitio como se mencionó anteriormente ). Esta parece ser la forma en que la mayoría de los paquetes se agregan a sys.path en lugar de usar PYTHONPATH.

Nota: En OSX hay una ruta de búsqueda adicional especial agregada por site.py para 'compilaciones de framework' (pero parece funcionar para el uso normal de la línea de comandos de python): /Library/Python/<version>/site-packages(por ejemplo, para Python2.7:) /Library/Python/2.7/site-packages/que es donde se supone que los paquetes de terceros para ser instalado (vea el archivo README en ese directorio). Por lo tanto, se puede agregar un archivo de configuración de ruta que contenga rutas de búsqueda adicionales, por ejemplo, crear un archivo llamado /Library/Python/2.7/site-packages/pip-usr-local.pthque contiene /usr/local/lib/python2.7/site-packages/y luego el sistema python agregará esa ruta de búsqueda.

Pierz
fuente
10

Para mí funcionó cuando cambié el .bash_profilearchivo. Solo cambiar el .bashrcarchivo funcionó solo hasta que reinicié el shell.

Para python 2.7 debería verse así:

export PYTHONPATH="$PYTHONPATH:/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python"

al final del .bash_profilearchivo.

Pedro gaitero
fuente
1
Si entiendo correctamente, esto exportará la variable para las sesiones de Python lanzadas a través del terminal, ¿verdad?
jxramos
1
@jxramos - ¡sí!
Peter Piper el
9

En Linux, puede crear un enlace simbólico desde su paquete a un directorio de PYTHONPATH sin tener que lidiar con las variables de entorno. Algo como:

ln -s /your/path /usr/lib/pymodules/python2.7/
Zah
fuente
7

Agregar export PYTHONPATH="${PYTHONPATH}:/my/other/path"a ~ / .bashrc podría no funcionar si PYTHONPATHno existe actualmente (debido a :).

export PYTHONPATH="/my/other/path1"
export PYTHONPATH="${PYTHONPATH}:/my/other/path2"

Agregar lo anterior a mi ~ / .bashrc me ayudó en Ubuntu 16.04

boyangeor
fuente
¡Lo hice echo PYTHONPATHy no apareció nada! eso significa que este PYTHONPATH no se ha inicializado, por lo que solo pego esta línea export PYTHONPATH=$PYTHONPATH:<PATH_TO_TF>/TensorFlow/models/research/object_detectionen mi ~/.bashrcarchivo y source ~/.bashrc esta. Más tarde, cuando `echo $ PYTHONPATH` me dio :<PATH_TO_TF>/TensorFlow/models/research/object_detection, ¿Alguna sugerencia sobre si he hecho algo mal?
Anu
export PYTHONPATH=<PATH_TO_TF>/TensorFlow/models/research/object_detection, cuando está exportando PYTHONPATH por primera vez, debe hacerlo sin la ${PYTHONPATH}:parte
boyangeor
Gracias, pero cada vez que reinicio mi computadora, la ruta de Python se restablece a la que configuré la primera, es decir, :<PATH_TO_TF>/TensorFlow/models/research/object_detectiony elimina la segunda export PYTHONPATH=$PYTHONPATH:/TensorFlow/models/research/slim. alguna sugerencia sobre eso, ¿cómo solucionarlo?
Anu
7

En MacOS, en lugar de dar ruta a una biblioteca específica. Dando la ruta completa a la carpeta del proyecto raíz en

~/.bash_profile 

me alegraron el día, por ejemplo:

export PYTHONPATH="${PYTHONPATH}:/Users/<myuser>/project_root_folder_path"

después de esto hacer:

source ~/.bash_profile
pruebas
fuente
6

Sólo para poner sobre la respuesta de awesomo, también se puede añadir que en su línea ~/.bash_profileo~/.profile

janex
fuente
Añadir a .bash_profilesi utiliza el shell de entrada, de lo contrario usar.profile
smac89
3

El agregar una nueva ruta a PYTHONPATH se realiza manualmente al:

agregando la ruta a su perfil ~ / .bashrc, en la terminal:

vim ~/.bashrc

pegue lo siguiente en su perfil

export PYTHONPATH="${PYTHONPATH}:/User/johndoe/pythonModule"

luego, asegúrese de obtener su perfil bashrc cuando ejecute su código en la terminal:

source ~/.bashrc 

Espero que esto ayude.

wpmoradi
fuente
2

Agregué permanentemente en Windows Vista, Python 3.5

Sistema> Panel de control> Configuración avanzada del sistema> Avanzado (toque) Variables de entorno> Variables del sistema> (si no ve PYTHONPATH en la columna Variable) (haga clic) Nuevo> Nombre de la variable: PYTHONPATH> Valor de la variable:

Por favor, escriba el directorio en el valor Variable. Es detalles de la respuesta de Blue Peppers.

Cloud Cho
fuente
1

El siguiente script funciona en todas las plataformas, ya que es Python puro. Utiliza la ruta pathlib, documentada aquí https://docs.python.org/3/library/pathlib.html , para que funcione multiplataforma. Lo ejecutas una vez, reinicias el kernel y listo. Inspirado en https://medium.com/@arnaud.bertrand/modifying-python-s-search-path-with-pth-files-2a41a4143574 .

from pathlib import Path
to_add=Path(path_of_directory_to_add)
from sys import path

if str(to_add) not in path:
    minLen=999999
    for index,directory in enumerate(path):
        if 'site-packages' in directory and len(directory)<=minLen:
            minLen=len(directory)
            stpi=index

    pathSitePckgs=Path(path[stpi])
    with open(str(pathSitePckgs/'current_machine_paths.pth'),'w') as pth_file:
        pth_file.write(str(to_add))
andrei deusteanu
fuente
1

Esta es una actualización de este hilo que tiene algunas respuestas antiguas.

Para aquellos que usan MAC-OS Catalina o algunos más nuevos (> = 10.15), se introdujo un nuevo Terminal llamado zsh(un sustituto del anterior bash).

He tenido algunos problemas con las respuestas anteriores debido a este cambio, y yo hice un poco de una solución mediante la creación del archivo ~/.zshrcy pegar el directorio de archivos a la $PATHe$PYTHONPATH

Entonces, primero hice:

nano ~/.zshrc

Cuando se abrió el editor, pegué el siguiente contenido:

export PATH="${PATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"
export PYTHONPATH="${PYTHONPATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"

lo guardó y reinició la terminal.

IMPORTANTE: La ruta de arriba está configurada para la ruta de mi computadora, tendrías que adaptarla a tu python.

Caio Oliveira
fuente
0

En Python 3.6.4 puede persistir sys.path en sesiones de Python como esta:

import sys
import os

print(str(sys.path))

dir_path = os.path.dirname(os.path.realpath(__file__))
print(f"current working dir: {dir_path}")

root_dir = dir_path.replace("/util", '', 1)
print(f"root dir: {root_dir}")

sys.path.insert(0, root_dir)

print(str(sys.path))

Te sugiero encarecidamente que uses virtualenv y virtualenvwrapper, de lo contrario, abarrotarás tu camino

Pato de goma
fuente
-3

La ruta más corta entre A <-> B es una línea recta;

import sys
if not 'NEW_PATH' in sys.path:
  sys.path += ['NEW_PATH']
Al Kari
fuente