@ Ответ Махеша на 100% правильный и точный, но я думаю, нам нужно углубиться на один уровень, чтобы вы лучше его поняли
Ниже приведен код для import_module
def import_module(name, package=None):
"""Import a module.
The 'package' argument is required when performing a relative import. It
specifies the package to use as the anchor point from which to resolve the
relative import to an absolute import.
"""
level = 0
if name.startswith('.'):
if not package:
msg = ("the 'package' argument is required to perform a relative "
"import for {!r}")
raise TypeError(msg.format(name))
for character in name:
if character != '.':
break
level += 1
return _bootstrap._gcd_import(name[level:], package, level)
Вы можете видеть, что name
не начинается с .
, тогда часть if
не выполняется.У вас просто есть return _bootstrap._gcd_import(name[level:], package, level)
, который выполняется с level=0
в качестве значения
Теперь давайте перейдем к той функции, которая имеет код ниже
def _gcd_import(name, package=None, level=0):
"""Import and return the module based on its name, the package the call is
being made from, and the level adjustment.
This function represents the greatest common denominator of functionality
between import_module and __import__. This includes setting __package__ if
the loader did not.
"""
_sanity_check(name, package, level)
if level > 0:
name = _resolve_name(name, package, level)
return _find_and_load(name, _gcd_import)
Опять в этом она просто выполняет _find_and_load(name, _gcd_import)
, теперь, поскольку level
- это 0
из нашего предыдущего кода, параметр package
не передается или не используется методом _find_and_load
.Теперь вы можете легко проверить это, запустив ниже
import importlib
hello = importlib.import_module('hello', package='IAmNotAfolder')
hello.hello()
И он напечатает Hello World
из базы hello.py
Так что, как вы видите, параметр package
не используетсявообще, когда имя не начинается с .
, что для относительного импорта.Вот почему вы получаете ошибку No module named 'hello'
, потому что она пытается импортировать hello.py
из базовой папки, независимо от того, что у вас в пакете.
Надеюсь, этот ответ облегчит вам понимание того, что происходит позадисцены