Понять импорт пакетов

1

Я начал изучать Python совсем недавно. У меня есть машинопись и С# фон. Я пытался понять пакеты и утверждения импорта. Ниже приведена очень простая структура папок, которую я создал, и у меня есть несколько вопросов по этому вопросу.

app/
 |-> pkg1/
      |-> fib.py
      |-> __init__.py
 |- >pkg2/
      |-> mul.py
      |-> __init__.py
 |-> app.py
ext/
 |-> ext.py
 |-> __init__.py 

fib.py
------
from pkg2.mul import mul
// from ..pkg2.mul import mul -> Error: attempted relative import beyond top-level package
// but this should work as per docs https://docs.python.org/3/tutorial/modules.html#intra-package-references
// can someone tell why do I get this error?

def fib(n):
    return mul(n) * 2

mul.py
------
def mul(n):
    return n * 10

app.py
------
from pkg1.fib import fib
print(fib(1))

Я читал, что Python рассматривает любой файл как входной файл.

  • Python знает, что app.py является точкой входа? Нет наверное.
  • Почему это работает, когда я дал pkg2.mul в fib.py
  • Почему это работает, когда я дал pkg1.fib в app.py
  • Что делать, если я хочу включить ext.py внутри mul.py и app.py
  • Согласно структуре папок, если app.py pkg1.fib (относительно app.py) допустим, то fib.py должен импортировать mul по-другому, правильно? почему это работает для pkg2.mul? Действительно ли это действительно? pkg2/ не fib.py к fib.py

Я что-то пропустил? В машинописном тексте мы используем относительный импорт, а в С# мы используем пространства имен и включаемые файлы, но здесь я немного запутался. Любая помощь очень ценится.

  • 0
    Это может помочь вам в пакете Python высокого уровня, но это может помочь вам использовать основы Введение в пакеты Python для абсолютных новичков
  • 1
    Похоже, вам не хватает __init__.py в вашем каталоге app/
Показать ещё 1 комментарий
Теги:

2 ответа

1

Ваша относительная попытка импорта не сработала, потому что pkg1 и pkg2 - это отдельные пакеты. Относительный импорт работает только в одной упаковке.

Python знает, что app.py является точкой входа?

Нет. Это просто какой-то .py файл, сидящий в каталоге.

Почему это работает, когда я дал pkg2.mul в fib.py

Стечение обстоятельств. Вы находитесь в каталоге app/, и первым элементом sys.path является рабочий каталог. Скорее всего, он не будет работать, если вы перейдете в другой каталог.

Почему это работает, когда я дал pkg1.fib в app.py

То же, что и выше.

Что делать, если я хочу включить ext.py внутри mul.py и app.py

Вы должны упаковать ext и включить его в качестве зависимости app.

Согласно структуре папок, если app.py pkg1.fib (относительно app.py) допустим, то fib.py должен импортировать mul по-другому, правильно? Почему это работает для pkg2.mul? Действительно ли это действительно? pkg2/ не fib.py к fib.py

Это не импорт по сравнению с app.py Они оба импортируются из cwd (проверьте первый элемент sys.path отображаемый с помощью python -m site)

  • 1
    вау sys.path это трюк, понял. Вы сделали мой день
  • 0
    Можете ли вы объяснить это утверждение подробно? Вы должны упаковать ext и включить его в качестве зависимости приложения. или любая ссылка также помогает
Показать ещё 2 комментария
0

Основная проблема заключается в том, что ваше app не является пакетом (поскольку в нем отсутствует файл __init__.py), что означает, что когда вы переходите на два уровня выше к каталогу app вы больше не в пакете, и это ошибка, указывающая, что вы попытка импортировать за пределы пакета верхнего уровня.

См. Этот раздел о ссылках внутри пакета для получения дополнительной информации о том, как вы можете реструктурировать свой пакет, чтобы разрешить то, что вы пытаетесь сделать. Вы также ознакомитесь с этим разделом, объясняющим путь поиска модуля, чтобы узнать немного больше контекста.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню