Я начал изучать 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 рассматривает любой файл как входной файл.
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
Я что-то пропустил? В машинописном тексте мы используем относительный импорт, а в С# мы используем пространства имен и включаемые файлы, но здесь я немного запутался. Любая помощь очень ценится.
Ваша относительная попытка импорта не сработала, потому что 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
)
Основная проблема заключается в том, что ваше app
не является пакетом (поскольку в нем отсутствует файл __init__.py
), что означает, что когда вы переходите на два уровня выше к каталогу app
вы больше не в пакете, и это ошибка, указывающая, что вы попытка импортировать за пределы пакета верхнего уровня.
См. Этот раздел о ссылках внутри пакета для получения дополнительной информации о том, как вы можете реструктурировать свой пакет, чтобы разрешить то, что вы пытаетесь сделать. Вы также ознакомитесь с этим разделом, объясняющим путь поиска модуля, чтобы узнать немного больше контекста.
__init__.py
в вашем каталогеapp/