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.