Aggiungere definitivamente una directory a PYTHONPATH?


324

Ogni volta che uso sys.path.append, verrà aggiunta la nuova directory. Tuttavia, una volta chiuso Python, l'elenco tornerà ai valori precedenti (impostazione predefinita?). Come posso aggiungere una directory in modo permanente PYTHONPATH?

Risposte:


135

Devi aggiungere la tua nuova directory alla variabile d'ambiente PYTHONPATH, separata da due punti dai precedenti contenuti. In qualsiasi forma di Unix, puoi farlo in uno script di avvio appropriato a qualunque shell tu stia usando ( .profileo qualunque cosa, a seconda della tua shell preferita) con un comando che, di nuovo, dipende dalla shell in questione; in Windows, è possibile farlo tramite la GUI di sistema allo scopo.

superuser.com potrebbe essere un posto migliore per chiedere di più, ad es. per maggiori dettagli se hai bisogno di dettagli su come arricchire una variabile d'ambiente nella piattaforma e nella shell che hai scelto, dal momento che in realtà non è una domanda di programmazione.


8
Errata: il separatore su Windows sarebbe un punto e virgola. Se è necessario sovrascrivere i percorsi di sistema su Windows, l'impostazione tramite la GUI come variabile di ambiente utente potrebbe non essere sufficiente, poiché le variabili utente vengono aggiunte alle variabili di sistema. In questi casi, dovrai ricorrere a uno script di avvio che apporti le modifiche necessarie.
Nathan Ernst,

1
@ Nathan, tx per il promemoria su virgola, ma (se sei un amministratore, naturalmente) si può impostare sistema env.vars sulle finestre (più, il PO è non chiedere come ignorare il percorso, proprio come accodare ad essa , quindi, anche un utente env.var andrà bene per questo! -).
Alex Martelli,

purtroppo non sono un amministratore sul mio PC di lavoro, quindi devo ricorrere a tali misure. :(
Nathan Ernst,

439

Se stai usando bash (su una distribuzione Mac o GNU / Linux), aggiungi questo al tuo ~/.bashrc

export PYTHONPATH="${PYTHONPATH}:/my/other/path"

28
Questo ha funzionato perfettamente per me, ma assicurati che la directory a cui fai riferimento abbia il file init .py più in alto nella tua struttura di directory. Questo all'inizio non era perfettamente chiaro per me. Ad esempio, ho provato ad esportare PYTHONPATH = $ PYTHONPATH: / Users / joey / repos ma non ha funzionato perché la mia directory repos non aveva _ init_ .py. Scendendo ulteriormente di una directory: / Users / joey / repos / specificRepo ha fatto il trucco. Ora python può attraversare qualsiasi directory discendente connessa alla directory specificRepo che contiene un init .py!
Qiao Yi

3
questo ha funzionato per me, ma potresti spiegare dove si trova questa variabile PYTHONPATH? e come fa "export PYTHONPATH" a localizzare quel file esatto?
AppleLover

42
ricordare dopo aver modificato ~/.bashrcquindi eseguire source ~/.bashrcSee stackoverflow.com/questions/2518127/...
b_dev

2
Penso che sia una cattiva idea mettere sudo suall'inizio del tuo file .bashrc. Questo post è d' accordo con me. Sul mio sistema, almeno, non è nemmeno necessario.
LondonRob

Questa è la risposta
Aerin

88

Invece di manipolare PYTHONPATHè anche possibile creare un file di configurazione del percorso . Per prima cosa scopri in quale directory Python cerca queste informazioni:

python -m site --user-site

Per qualche motivo questo non sembra funzionare in Python 2.7. Lì puoi usare:

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

Quindi creare un .pthfile in quella directory contenente il percorso che si desidera aggiungere (creare la directory se non esiste).

Per esempio:

# 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"

Ho provato questo usando Python 2.6 e non sembra funzionare per me
Lorcan O'Neill,

4
Ho semplicemente collegato questa directory alla mia directory della libreria e lì ho archiviato tutti i miei script. Ha funzionato bene.
firesofmay

Ho deciso di riprovare dopo aver trovato di nuovo questo argomento e sono riuscito a farlo funzionare come sopra questa volta! Mi scuso e contrito :)
Lorcan O'Neill

Funziona perfettamente, ero sulla strada giusta ma le parti python -m site --user-sitee (create the directory if it doesn't exist)erano ciò che mi mancava per farlo funzionare.
Aurélien Ooms,

1
Devo fare un ulteriore passo in modo che Python riconosca il percorso aggiunto a somelib.pth? In caso contrario, indovina perché potrebbe non funzionare?
Miladiouss,

38

Questo funziona su Windows

  1. Su Windows, con Python 2.7 vai alla cartella di installazione di Python.
  2. Apri i pacchetti Lib / site.
  3. Aggiungi un file vuoto example.pth a questa cartella.
  4. Aggiungi il percorso richiesto al file, uno per ogni riga.

Quindi sarai in grado di vedere tutti i moduli all'interno di quei percorsi dai tuoi script.


3
IMO, questa è la soluzione migliore, poiché non dipende dalla scelta della shell o dell'ambiente di lavoro. Funziona anche su Linux, dove il percorso python predefinito è "/usr/local/lib/pythonX.Y/site-packages". Se non funziona, prova invece a mettere il tuo file .pth nella directory dist-pacchetti.
matus,

1
Windows 7, Python 3.6.5. Questa è la risposta Come ha scritto auserdude: crea il "esempio.pth" nella cartella Lib / site-pacchetti di Python e quindi aggiungi il tuo percorso in questo modo: C: \ somefolder \ anotherfolder \ targetfolder
JayJay123

risposta eccellente, funziona anche con Python 3.7 su Windows 10, il mio percorso di Windows 10 è: "C: \ Users \ {nomeutente} \ AppData \ Local \ Programmi \ Python \ Python37-32 \ Lib"
Ali80,

Può confermare che funziona con Python 3.6.7 su Windows 10. Tuttavia, si noti che il percorso viene aggiunto a PYTHONPATH con ciò significa che il modulo aggiunto non verrà trovato nel caso di una collisione di nomi.
BramAppel,

25

Nel caso in cui qualcuno sia ancora confuso, se sei su un Mac, procedi come segue:

  1. Apri Terminale
  2. genere open .bash_profile
  3. Nel file di testo che si apre, aggiungi questa riga alla fine: export PYTHONPATH=$PYTHONPATH:foo/bar
  4. Salva il file, riavvia il Terminale e il gioco è fatto

2
Chiunque si chieda come vedere il percorso di Python, utilizzare: quale pitone
Arindam Roychowdhury

abbastanza sicuro che è necessario ricaricare anche il terminale
Utente

in realtà la exportchiave era la cosa che mi mancava !!!!, votata, grazie mille!
a_m_dev

21

È possibile aggiungere il percorso tramite il file pythonrc, il cui valore predefinito è ~ / .pythonrc su Linux. vale a dire.

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

Puoi anche impostare la PYTHONPATHvariabile d'ambiente, in un file rc globale, come ~/.profilesu mac o linux, oppure tramite Pannello di controllo -> Sistema -> scheda Avanzate -> Variabili d'ambiente su Windows.


40
sys.path.append ('/ path / to / dir') non aggiunge permanentemente la voce.
jeremyjjbrown,

15

Per dare un po 'più di spiegazione, Python costruirà automaticamente i suoi percorsi di ricerca (come menzionato sopra e qui ) usando lo site.pyscript (generalmente situato in sys.prefix + lib/python<version>/site-packagese lib/site-python). Si può ottenere il valore di sys.prefix:

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

Lo script site.py aggiunge quindi una serie di directory, dipendenti dalla piattaforma, come ad esempio /usr/{lib,share}/python<version>/dist-packages, /usr/local/lib/python<version>/dist-packagesal percorso di ricerca e cerca anche questi <package>.pthfile per i file di configurazione che contengono percorsi di ricerca aggiuntivi specifici. Ad esempio, easy-install mantiene la sua raccolta di pacchetti installati che vengono aggiunti a un file specifico del sistema, ad esempio su Ubuntu /usr/local/lib/python2.7/dist-packages/easy-install.pth. Su un sistema tipico ci sono un sacco di questi file .pth intorno ai quali possono spiegare alcuni percorsi inaspettati in sys.path:

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

Quindi si può creare un file .pth e inserire una di queste directory (incluso il sito come menzionato sopra ). Questo sembra essere il modo in cui la maggior parte dei pacchetti viene aggiunta a sys.path invece di usare PYTHONPATH.

Nota: su OSX è disponibile uno speciale percorso di ricerca aggiuntivo aggiunto da site.py per 'build del framework' (ma sembra funzionare per il normale uso della riga di comando di python): /Library/Python/<version>/site-packages(ad esempio per Python2.7:) /Library/Python/2.7/site-packages/che è dove si suppongono pacchetti di terze parti da installare (vedere il README in quella directory). Quindi si può aggiungere un file di configurazione del percorso che contiene percorsi di ricerca aggiuntivi, ad es. Creare un file chiamato /Library/Python/2.7/site-packages/pip-usr-local.pthche contiene /usr/local/lib/python2.7/site-packages/e quindi il sistema Python aggiungerà quel percorso di ricerca.


10

Per me ha funzionato quando ho cambiato il .bash_profilefile. Sto solo cambiando.bashrc file ha funzionato solo fino a quando non ho riavviato la shell.

Per python 2.7 dovrebbe apparire come:

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

alla fine del .bash_profilefile.


1
Se ho capito bene questo esporterà la variabile per le sessioni Python avviata tramite il terminale giusto?
jxramos,

1
@jxramos - yes!
Peter Piper,

9

Su Linux è possibile creare un collegamento simbolico dal pacchetto a una directory di PYTHONPATH senza dover gestire le variabili di ambiente. Qualcosa di simile a:

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

7

L'aggiunta export PYTHONPATH="${PYTHONPATH}:/my/other/path"a ~ / .bashrc potrebbe non funzionare se PYTHONPATHattualmente non esiste (a causa di :).

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

L'aggiunta di quanto sopra al mio ~ / .bashrc ha fatto il trucco per me su Ubuntu 16.04


L'ho fatto echo PYTHONPATHe non mi è apparso nulla! ciò significa che questo PYTHONPATH non è stato inizializzato, quindi ho appena incollato questa riga export PYTHONPATH=$PYTHONPATH:<PATH_TO_TF>/TensorFlow/models/research/object_detectionnel mio ~/.bashrcfile e source ~/.bashrc . Più tardi, quando ho fatto "eco $ PYTHONPATH" mi ha dato :<PATH_TO_TF>/TensorFlow/models/research/object_detection, qualche suggerimento su se ho fatto qualcosa di sbagliato?
Anu,

export PYTHONPATH=<PATH_TO_TF>/TensorFlow/models/research/object_detection, quando esporti PYTHONPATH per la prima volta devi farlo senza la ${PYTHONPATH}:parte
boyangeor

Grazie, ma ogni volta che riavvio il mio computer il percorso python viene ripristinato a quello che imposto il 1 ° ie :<PATH_TO_TF>/TensorFlow/models/research/object_detectionrimuove il 2 ° export PYTHONPATH=$PYTHONPATH:/TensorFlow/models/research/slim. qualche suggerimento a riguardo, come risolverlo?
Anu,

7

Su MacOS, invece di dare il percorso a una libreria specifica. Dare il percorso completo alla cartella del progetto principale in

~/.bash_profile 

fatto la mia giornata, ad esempio:

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

dopo questo fai:

source ~/.bash_profile

6

Solo per aggiungere la risposta di awesomo, puoi anche aggiungere quella riga nel tuo ~/.bash_profileo~/.profile


Aggiungi a .bash_profilese usi la shell di accesso, altrimenti usa.profile
smac89

3

L'aggiunta di un nuovo percorso a PYTHONPATH sta effettuando manualmente:

aggiungendo il percorso al tuo profilo ~ / .bashrc, nel terminale da:

vim ~/.bashrc

incolla quanto segue sul tuo profilo

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

quindi, assicurati di creare il tuo profilo bashrc ogni volta che esegui il codice nel terminale:

source ~/.bashrc 

Spero che questo ti aiuti.


2

Ho aggiunto permanentemente in Windows Vista, Python 3.5

Sistema> Pannello di controllo> Impostazioni di sistema avanzate> Avanzate (tocca) Variabili d'ambiente> Variabili di sistema> (se non vedi PYTHONPATH nella colonna Variabile) (fai clic) Nuovo> Nome variabile: PYTHONPATH> Valore variabile:

Si prega di scrivere la directory nel valore della variabile. Sono i dettagli della risposta di Blue Peppers.


1

Lo script seguente funziona su tutte le piattaforme in quanto è puro Python. Si avvale del percorso pathlib, documentato qui https://docs.python.org/3/library/pathlib.html , per farlo funzionare su più piattaforme. Lo esegui una volta, riavvia il kernel e il gioco è fatto. Ispirato da 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))

1

Questo è un aggiornamento a questo thread che ha alcune vecchie risposte.

Per quelli che usano MAC-OS Catalina o alcuni più recenti (> = 10.15), è stato introdotto un nuovo Terminale chiamato zsh(un sostituto del vecchio bash).

Ho avuto alcuni problemi con le risposte sopra a causa di questa modifica e in qualche modo ho fatto una soluzione alternativa creando il file ~/.zshrce incollando la directory dei file su $PATHe$PYTHONPATH

Quindi, prima ho fatto:

nano ~/.zshrc

Quando l'editor è stato aperto ho incollato il seguente contenuto:

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

salvato e riavviato il terminale.

IMPORTANTE: il percorso sopra è impostato sul percorso del mio computer, dovresti adattarlo al tuo Python.


0

In Python 3.6.4 puoi persistere sys.path tra le sessioni di Python in questo modo:

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))

Ti consiglio vivamente di usare virtualenv e virtualenvwrapper, altrimenti ingombrerai il tuo percorso


-3

Il percorso più breve tra A <-> B è una linea retta;

import sys
if not 'NEW_PATH' in sys.path:
  sys.path += ['NEW_PATH']
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.