¿Cómo agrego una ruta a PYTHONPATH en virtualenv?

97

Estoy tratando de agregar una ruta a la variable de entorno PYTHONPATH, que solo sería visible desde un entorno virtualenv particular.

Lo intenté SET PYTHONPATH=...con un símbolo del sistema virtualenv, pero eso establece la variable para todo el entorno.

¿Cómo lo logro?

Flavien
fuente

Respuestas:

155

Por lo general, puede evitar tener que hacer algo con PYTHONPATH utilizando .ptharchivos . Simplemente coloque un archivo con una extensión .pth (cualquier nombre de base funciona) en la carpeta de paquetes del sitio de su virtualenv, por ejemplo lib\python2.7\site-packages, con la ruta absoluta al directorio que contiene su paquete como único contenido.

Dougal
fuente
Desafortunadamente, esto no funciona como anulación. Agrega la ruta, por lo que si está desarrollando, no funciona.
Erik Aronesty
Además, si conoce la ruta absoluta, ¿cuál es el punto de una variable?
Jamie Marshall
también puede navegar a la carpeta de paquetes del sitio de su entorno virtual y crear un enlace simbólico al archivo .pth como este: ln -s ruta / a / somfile.pth. Encontré esto útil cuando necesitaba que el mismo directorio fuera accesible en múltiples entornos virtuales
Data-phile
91

Si está usando virtualenv, probablemente también debería usar virtualenvwrapper , en cuyo caso puede usar el comando add2virtualenv para agregar rutas a la ruta de Python para el virtualenv actual:

add2virtualenv directory1 directory2 …

ministro del crimen
fuente
3
¿Qué tal eliminar de virtualenv?
silverdagger
1
Quiero agregar un comentario amistoso que en hosts compartidos y situaciones similares no se desea la envoltura de venv. En tales casos, un venv está en efecto y no se desea todo lo que se necesita para realizar la instalación adicional. A nivel local, las cosas son diferentes, pero en el servidor / imagen, KISS es realmente importante.
Marc
2
No estoy seguro de cómo funcionó el comando cuando se escribió esto, pero add2virtualenvno modifica $ PYTHONPATH, sino que modifica sys.path.
ForeverWintr
1
@ajostergaard: Lo siento, debería haber proporcionado una fuente. Si observa el código fuente de add2virtualenv, puede ver que está modificando sys.path. Estoy de acuerdo en que los documentos hacen que parezca que modifica la PYTHONPATHvariable de entorno, pero eso parece ser incorrecto. bitbucket.org/virtualenvwrapper/virtualenvwrapper/src/…
ForeverWintr
1
@ForeverWintr Estoy corregido: los archivos .pth se utilizan para configurar sys.path. docs.python.org/2/library/site.html ¡Confused.com!
ostergaard
5

También puede intentar poner un enlace simbólico a uno de sus virtualenv.

p.ej. 1) active su virtualenv 2) ejecute python 3) importe sys y verifique sys.path 4) encontrará la ruta de búsqueda de python allí. Elija uno de esos (por ejemplo, paquetes de sitio) 5) vaya allí y cree un enlace simbólico a su paquete como: ln -s ruta-al-nombre-de-su-paquete-con-el-que-estará-importando

De esa manera, debería poder importarlo incluso sin activar su virtualenv. Simplemente intente: ruta-a-su-carpeta-virtualenv / bin / python e importe su paquete.

Slavko-t
fuente
Supongo que se votó negativamente por usar enlaces simbólicos en lugar de archivos .pth. Sin embargo, funcionó para mí, así que, en cualquier caso.
Gareth Davidson
3

Si está utilizando virtualenvwrapper,

$ cd to the parent folder
$ add2virtualenv  folder_to_add

la consola mostrará

Warning: Converting "folder_to_add" to "/absoutle/path/to/folder_to_add"

Eso es todo, y deberías estar listo para irte

Aneesh Panoli
fuente
1
import sys
import os

print(str(sys.path))

dir_path = os.path.dirname(os.path.realpath(__file__))
print("current working dir: %s" % dir_path)

sys.path.insert(0, dir_path)

Le sugiero que use virtualenv y virtualenvwrapper para evitar saturar el camino.

Pato de goma
fuente
si desea que esto funcione con cualquier versión de Python, simplemente use un formato de cadena de estilo antiguo normal en lugar del elegante f-string f "... {dir_path}"
Guillaume S
Gracias por el comentario. Lo revisé para su uso. las viejas formas son engorrosas e idiosincrásicas y no hay nada elegante en un sistema de plantillas simple
Rubber Duck
Todo es relativo :)
Guillaume S