Это первый раз, когда я по-настоящему сел и попробовал Python 3, и, похоже, с треском провалился. У меня есть следующие два файла:
- test.py
- config.py
В файле config.py определено несколько функций, а также несколько переменных. Я сократил это до следующего:
config.py
debug = True
test.py
import config
print (config.debug)
У меня также есть __init__.py
Однако я получаю следующую ошибку:
ModuleNotFoundError: No module named 'config'
Я знаю, что соглашение py3 должно использовать абсолютный импорт:
from . import config
Однако это приводит к следующей ошибке:
ImportError: cannot import name 'config'
Так что я в растерянности относительно того, что делать здесь ... Любая помощь очень ценится. :)
python
python-3.x
package
python-import
relative-import
blitzmann
источник
источник
python test.py
, и он прекрасно работает. У меня нет pyCharm, но, возможно, есть какая-то плохая конфигурация pyCharm, которая вызывает проблемуОтветы:
TL; DR: вы не можете выполнять относительный импорт из исполняемого файла, поскольку
__main__
модуль не является частью пакета.Абсолютный импорт - импортируйте что-то доступное на
sys.path
Относительный импорт - импорт чего-либо относительно текущего модуля, должен быть частью пакета
Если вы используете оба варианта одинаково, один из них должен работать. В любом случае, вот пример, который должен помочь вам понять, что происходит, давайте добавим еще один
main.py
файл с общей структурой каталогов:И давайте обновим test.py, чтобы увидеть, что происходит:
Давайте сначала запустим test.py:
Здесь «тест» является
__main__
модулем и ничего не знаю о принадлежности к упаковке , не знает. Однакоimport config
должно работать, так какryan
папка будет добавлена в sys.path.Давайте вместо этого запустим main.py:
И здесь тест находится внутри пакета «Райан» и может выполнять относительный импорт.
import config
терпит неудачу, так как неявный относительный импорт не разрешен в Python 3.Надеюсь, это помогло.
PS: если вы придерживаетесь Python 3, больше нет необходимости в
__init__.py
файлах.источник
sys.path.append('/some/path/my_module')
внутрь/some/path/my_module/__init__.py
?sys.path
во время выполнения ( github.com/… ). Вы также можете установить переменную окружения PYTHONPATH.__init__.py
файлы». Интересный. Вы можете остановиться на этом? У меня сложилось впечатление, что механизм разрешения пакетов не сильно изменился между 2 и 3.__init__.py
файлы». И наоборот, можете ли вы описать вещи, если мы хотим, чтобы пакет работал как в 2, так и в 3? И посмотрите на печально устаревший 2009 год. Для чего__init__.py
? и его самый высокооплачиваемый ответ «Это часть пакета» . Нам нужно начать подчеркивать различие «обычный пакет [старый, до 3.3]« vs »пакет пространства имен [3.3+]» везде и часто.Я понял. Очень расстраивает, особенно с python2.
Вы должны добавить
.
к модулю, независимо от того, является ли он относительным или абсолютным.Я создал каталог установки следующим образом.
modx.py
mody.py
main.py
когда я выполняю основной, это то, что происходит
Я запустил 2to3, и основной вывод был
Мне пришлось изменить оператор импорта mody.py, чтобы исправить это
Затем я снова запустил main.py и получил ожидаемый результат
Наконец, просто чтобы очистить его и сделать его переносимым между 2 и 3.
источник
try/except
процедура загрузки является реальным компонентом, который работает здесь (поскольку некоторые люди должны будут использоватьtry:scripts.modx
иexcept: modx
), и именно это решило эту проблему для меня.Настройка PYTHONPATH также может помочь с этой проблемой.
Вот как это можно сделать на Windows
set PYTHONPATH=.
источник
Вы должны добавить путь к модулю
PYTHONPATH
.Для UNIX (Linux, OSX, ...)
Для Windows
источник
Попробовал твой пример
Это будет работать для меня:
Протестировано с Python: 3.4.2 - PyCharm 2016.3.2
Помимо этого PyCharm предлагает вам импортировать это имя .
Вы должны нажать,
config
и появится значок справки .источник
Вы можете просто добавить следующий файл в ваш каталог тестов, и тогда python запустит его перед тестами
источник
Устанавливать
PYTHONPATH
переменную среды в корневом каталоге проекта.Учитывая UNIX-подобный:
источник
Этот пример работает на Python 3.6.
Я предлагаю пойти в
Run -> Edit Configurations
в PyCharm, удалить все записи и попытаться снова запустить код через PyCharm.Если это не сработает, проверьте интерпретатор проекта («Настройки» -> «Интерпретатор проекта») и запустите настройки по умолчанию («Выполнить» -> «Редактировать конфигурации»).
источник
Объявите правильный список sys.path перед вызовом модуля:
источник
Как было указано в комментариях к исходному сообщению, это, похоже, проблема с интерпретатором Python, который я использовал по какой-либо причине, а не что-то не так с скриптами Python. Я переключился с пакета WinPython на официальный python 3.6 с python.org, и он работал просто отлично. Спасибо всем за помощь :)
источник
Если вы используете Python 3+, попробуйте добавить строки ниже
источник
Пытаться
Что это делает, это импорт из того же уровня папки. Если вы пытаетесь импортировать напрямую, предполагается, что это подчиненный
источник