Domanda Effetto dell'utilizzo di sys.path.insert (0, path) e sys.path (append) durante il caricamento dei moduli


Recentemente ho avuto un problema con un python ImportError, in cui il modulo è stato trovato quando è stato eseguito sul mio computer locale ma non è stato trovato sul server CI. Ho risolto questo problema scambiando sys.path.append(path) nel mio script con sys.path.insert(0, path) dove path è la posizione del modulo di stringa.

Poiché questo è il mio modulo e non un pacchetto installato (domanda correlata), perché l'ordine dei percorsi risolve questo problema?


14
2017-07-08 11:42


origine


risposte:


Perché python controlla le directory in ordine sequenziale a partire dalla prima directory in sys.path elenco, fino a trovare il .py file che stava cercando.

Idealmente, la directory corrente o la directory dello script è il primo sempre il primo elemento della lista, a meno che tu non lo modifichi, come hai fatto tu. A partire dal documentazione -

Come inizializzato all'avvio del programma, il primo elemento di questo elenco, path [0], è la directory contenente lo script che è stato utilizzato per invocare l'interprete Python. Se la directory di script non è disponibile (ad es. Se l'interprete viene richiamato in modo interattivo o se lo script viene letto dall'input standard), path [0] è la stringa vuota, che dirige a Python prima la ricerca dei moduli nella directory corrente. Si noti che la directory degli script viene inserita prima delle voci inserite come risultato di PYTHONPATH.

Quindi, molto probabilmente, hai avuto un .py file con lo stesso nome del modulo da cui si sta tentando di importare, nella directory corrente (da cui è stato eseguito lo script).

Inoltre, una cosa da notare ImportErrors, diciamo che l'errore di importazione dice - ImportError: No module named main - non significa il main.py viene sovrascritto, no se questo è stato sovrascritto, non avremmo problemi nel tentativo di leggerlo. Alcuni moduli sopra questo sono stati sovrascritti con un.py o qualche altro file.

Esempio -

La mia struttura di directory è simile a -

 - test
    - shared
         - __init__.py
         - phtest.py
  - testmain.py

Ora da testmain.py , Chiamo from shared import phtest , funziona bene.

Ora diciamo di introdurre una shared.py in test directory`, esempio -

 - test
    - shared
         - __init__.py
         - phtest.py
  - testmain.py 
  - shared.py

Ora quando provo a fare from shared import phtest a partire dal testmain.py , Avrò l'errore -

ImportError: cannot import name 'phtest'

Come puoi vedere sopra, il file che causa il problema è shared.py no phtest.py .


15
2017-07-08 11:45



Sono piuttosto un principiante in Python e ho trovato che la risposta di Anand era molto buona ma piuttosto complicata per me, quindi provo a riformulare:

1) insert e append i metodi non sono specifici per sys.path e come in altre lingue aggiungono un elemento in un elenco o array e:
  * append(item) Inserisci item alla fine della lista,
  * insert(n, item) inserisce il item all'ennesimo posto nell'elenco (0 all'inizio, 1 dopo il primo elemento, ecc ...).

2) Come ha detto Anand, python cerca i file di importazione in ogni directory del percorso nell'ordine del percorso, quindi:
  * Se non si hanno collisioni di nomi di file, l'ordine del percorso non ha impatto,
  * Se ti occupi di una funzione già definita nel percorso e la usi appendper aggiungere il tuo percorso, non otterrai la tua funzione ma quella predefinita.

Ma penso che sia meglio da usare append e non insert non sovraccaricare il comportamento standard di Python e utilizzare nomi non ambigui per i tuoi file e metodi.


11
2018-03-18 12:21