Поскольку python проверяет в каталогах в порядке очередности, начиная с первого каталога в sys.path
, пока не найдет файл .py
, который он искал.
В идеале, текущий каталог или каталог сценария является первым всегда первым элементом в списке, если вы не измените его, как вы это делали. Из 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.
Так что, скорее всего, вы имели .py
файл с таким же именем, что и модуль вы пытаетесь импортировать из, в текущем каталоге (где скрипт запускается с).
Кроме того, вещь отметить о ImportError
с, позволяет сказать, что ошибка импорта говорит - ImportError: No module named main
- это не значит, что main.py
переписывается, нет, если это был переписан мы бы не возникли проблемы, пытаясь прочитать его. Его некоторый модуль выше этого, который был перезаписан a. py
или какой-либо другой файл.
Пример -
Моя структура каталогов выглядит -
- test
- shared
- __init__.py
- phtest.py
- testmain.py
Теперь из testmain.py
, я называю from shared import phtest
, он отлично работает.
Теперь позволяет сказать, что я ввести shared.py в test
directory`, пример -
- test
- shared
- __init__.py
- phtest.py
- testmain.py
- shared.py
Теперь, когда я пытаюсь сделать from shared import phtest
из testmain.py
, я получаю ошибку -
ImportError: cannot import name 'phtest'
Как вы можете видеть выше, файл, вызывающий проблему, составляет shared.py
, а не phtest.py
.
Возможный дубликат [Зачем использовать sys.path.append (путь) вместо sys.path.insert (1, путь)?] (Http://stackoverflow.com/questions/10095037/why-use-sys- путь-appendpath-вместо-sys-path-insert1-path) – CrandellWS