Понимание того, как работает метод импорта Python3 - PullRequest
0 голосов
/ 10 мая 2019

Я работал над приложением python3 и столкнулся со странной проблемой, которая привлекла мое любопытство после того, как сильно меня раздражает.

Моя файловая структура выглядит примерно так:

root/
 |   __init__.py
 |   main.py
 |   fuzzy/
     |    __init__.py
     |    foo.py
 |   dreamy/
     |    __init__.py
     |    bar.py
     |    meh.py

Поэтому мне нужно использовать метод модуля foo в bar и meh.

В bar Я написал:

from fuzzy.foo import foo_function

И это сработало отличноотлично.

Теперь в meh я использовал точно такой же синтаксис, но в результате возникла ошибка импорта:

ModuleNotFoundError: No module named 'fuzzy'

Мне удалось решить проблему с помощью this метод, но я хотел бы понять, почему это происходит.

Согласно документации Python3 мой синтаксис импорта правильный:

Альтернативный способ импортаподмодуль:

from sound.effects import echo

Похоже, это также синтаксис, предоставленный ответ на вопрос на этом форуме

Более того, обаbar и meh находятся в одном каталоге, и их код начинается точно так же.

Кто-нибудь знает, почему эта ошибка возникает в одном файле, а не в другом?

Есть ли что-то, что я сделал не так?

Если я сделал что-то не так, каков был бы правильный путь (или хорошие практики) для импорта локальных пакетов / методов?

Спасибо за понимание.

--- EDIT ---

Я не возился с моим PYTHONPATHв любом случае, и я использую Python3 из (ванильного) Conda venv.Для хороших мер я также создал новую файловую структуру и скопировал код в новые пустые файлы.Это сделано для того, чтобы с моим каталогом ничего «смешного» не случилось.

1 Ответ

0 голосов
/ 05 июня 2019

Этот вопрос кажется очень простым, однако я заметил, что другие люди боролись с ним.

Хотя я нашел ответ на свой вопрос благодаря Baum mit Augen .

Баум мит Ауген нашел время написать этот ответ , который очень поучителен и хорошо написан.

Итак, подытожу мою проблему: в процессе разработки я пытался вызывать свои функции с помощьюзапуск моего bar.py из терминала.Это означает, что bar является main , но находится внутри подкаталога пакета.Это вызывает ошибку импорта, потому что «ее имя не указывает на то, что она находится в пакете».

Я просто хочу выделить 2 вещи, не связанных с моим вопросом:

  1. Рассматривая сообщениена котором я нашел этот ответ, это НЕ простая проблема.К вашему сведению: я быстро поболтал с разработчиком Python, который не смог найти слов, чтобы объяснить это мне.
  2. Мне кажется невероятным, что те, кто обращаются за помощью по действительным вопросам, в основном отвечают на «RTFM»в стиле ар-линукс.Мне действительно жаль.
...