Poiché python controlla le directory in ordine sequenziale a partire dalla prima directory nell'elenco sys.path
, fino a trovare il file .py
che cercava.
Idealmente, la directory corrente o la directory dello script è il primo sempre il primo elemento nell'elenco, a meno che non lo modifichi, come hai fatto tu. Da documentation -
As initialized upon program startup, the first item of this list, path[0], is the directory containing the script that was used to invoke the Python interpreter. If the script directory is not available (e.g. if the interpreter is invoked interactively or if the script is read from standard input), path[0] is the empty string, which directs Python to search modules in the current directory first. Notice that the script directory is inserted before the entries inserted as a result of PYTHONPATH.
Quindi, molto probabilmente, si ha un file .py
con lo stesso nome del modulo si stava tentando di importare, nella directory corrente (in cui lo script è stato eseguito da).
Inoltre, una cosa da notare su ImportError
s, diciamo l'errore di importazione dice - ImportError: No module named main
- non significa la main.py
viene sovrascritto, non se questo è stato sovrascritto non avremmo avendo edizioni che provano a leggerlo. Alcuni moduli sopra questo sono stati sovrascritti con un. py
o qualche altro file.
Esempio -
mia struttura di directory sembra -
- test
- shared
- __init__.py
- phtest.py
- testmain.py
Ora Da testmain.py
, chiamo from shared import phtest
, funziona benissimo.
Ora lascia dire introduco uno shared.py in test
directory`, ad esempio -
- test
- shared
- __init__.py
- phtest.py
- testmain.py
- shared.py
Ora, quando provo a fare from shared import phtest
da testmain.py
, mi metterò l'errore -
ImportError: cannot import name 'phtest'
Come puoi vedere sopra, il file che causa il problema è shared.py
, non phtest.py
.
Possibile duplicato di [Perché utilizzare sys.path.append (percorso) anziché sys.path.insert (1, percorso)?] (Http://stackoverflow.com/questions/10095037/why-use-sys- percorso-appendpath-invece-di-sys-path-insert1-path) – CrandellWS