Come aggiungo un percorso a PYTHONPATH in virtualenv


97

Sto cercando di aggiungere un percorso alla variabile d'ambiente PYTHONPATH, che sarebbe visibile solo da un particolare ambiente virtualenv.

Ho provato SET PYTHONPATH=...con un prompt dei comandi virtualenv, ma questo imposta la variabile per l'intero ambiente.

Come posso ottenerlo?

Risposte:


155

Di solito puoi evitare di dover fare qualsiasi cosa con PYTHONPATH usando i .pthfile . Metti semplicemente un file con estensione .pth (qualsiasi nome di base funziona) nella cartella site-packages di virtualenv, ad esempio lib\python2.7\site-packages, con il percorso assoluto della directory contenente il tuo pacchetto come unico contenuto.


Purtroppo questo non funziona come un override. Aggiunge il percorso, quindi se stai sviluppando non funziona.
Erik Aronesty

Inoltre, se conosci il percorso assoluto, qual è il punto di una variabile?
Jamie Marshall

puoi anche navigare nella cartella site-packages del tuo ambiente virtuale e creare un collegamento simbolico al file .pth in questo modo: ln -s path / to / somfile.pth. L'ho trovato utile quando avevo bisogno che la stessa directory fosse accessibile in più ambienti virtuali
Data-phile

91

Se stai usando virtualenv, dovresti probabilmente usare anche virtualenvwrapper , nel qual caso puoi usare il comando add2virtualenv per aggiungere percorsi al percorso Python per l'attuale virtualenv:

add2virtualenv directory1 directory2 …


3
Che ne dici di rimuovere da virtualenv?
silverdagger

1
Voglio aggiungere un commento amichevole che su host condivisi e situazioni simili venv wrapper non è desiderato. In questi casi è attivo un solo venv e tutto ciò che è necessario per effettuare l'installazione aggiuntiva non è desiderato. A livello locale le cose sono diverse, ma sul server / immagine KISS è davvero importante.
Marc

2
Non sono sicuro di come funzionasse il comando quando è stato scritto, ma add2virtualenvnon modifica $ PYTHONPATH, piuttosto modifica sys.path.
ForeverWintr

1
@ajostergaard: Scusa, avrei dovuto fornire una fonte. Se guardi il codice sorgente di add2virtualenv, puoi vedere che sta modificando sys.path. Sono d'accordo che i documenti facciano sembrare che modifichi la PYTHONPATHvariabile d'ambiente, ma sembra non essere corretto. bitbucket.org/virtualenvwrapper/virtualenvwrapper/src/…
ForeverWintr

1
@ForeverWintr Sono stato corretto: i file .pth vengono utilizzati per configurare sys.path. docs.python.org/2/library/site.html Confused.com!
ostergaard

5

Puoi anche provare a mettere un collegamento simbolico a uno dei tuoi virtualenv.

per esempio. 1) attiva il tuo virtualenv 2) esegui python 3) importa sys e controlla sys.path 4) troverai il percorso di ricerca python lì. Scegli uno di questi (es. Site-packages) 5) vai lì e crea un collegamento simbolico al tuo pacchetto come: ln -s path-to-your-package name-with-which-you're-importing

In questo modo dovresti essere in grado di importarlo anche senza attivare il tuo virtualenv. Prova semplicemente: path-to-your-virtualenv-folder / bin / python e importa il tuo pacchetto.


Immagino che questo sia stato downvoted per l'utilizzo di collegamenti simbolici anziché file .pth. Per me ha funzionato, quindi, qualunque cosa.
Gareth Davidson

3

Se stai usando virtualenvwrapper,

$ cd to the parent folder
$ add2virtualenv  folder_to_add

verrà visualizzata la console

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

Questo è tutto, e dovresti essere a posto


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)

Consiglio vivamente di utilizzare virtualenv e virtualenvwrapper per evitare di ingombrare il percorso.


se vuoi che funzioni con qualsiasi versione di Python, usa un normale formato di stringa vecchio stile piuttosto che la fantasia f-stringa f "... {dir_path}"
Guillaume S

Grazie per il commento. Ho rivisto per l'uso. i vecchi metodi sono ingombranti e stravaganti e non c'è niente di stravagante in un semplice sistema di modelli
Rubber Duck

Tutto è relativo :)
Guillaume S
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.