import importlib.abc.SourceLoader
Сообщение об ошибке, которое выдает эта строка, должно дать вам подсказку, где вы ошиблись:
ModuleNotFoundError: No module named 'importlib.abc.SourceLoader'; 'importlib.abc' is not a package
"import foo
" требует, чтобы foo
был модулем, но SourceLoader
- это класс внутри модуля.Вместо этого вам нужно написать:
from importlib.abc import SourceLoader
Однако есть еще проблемы с этой строкой:
answer = SourceLoader.is_package(posbl_pkg)
Прежде всего, SourceLoader.is_package
является экземпляромметод, а не класс или статический метод;он должен вызываться для экземпляра SourceLoader
, а не для самого класса.Тем не менее, SourceLoader
является абстрактным классом, поэтому его нельзя создать напрямую;вам нужно использовать конкретный подкласс типа SourceFileLoader
.(Когда документы называют SourceLoader.is_package
«конкретной реализацией» InspectLoader.is_package
, я считаю, что они имеют в виду, что SourceLoader
обеспечивает реализацию по умолчанию для is_package
, так что его подклассам не нужно переопределять его, чтобыбыть неабстрактным.)
Следовательно, вам нужно написать:
from importlib.machinery import SourceFileLoader
...
answer = SourceFileLoader(fullname, path).is_package(fullname)
, где fullname
- это «полностью разрешенное имя модуля, который должен обрабатывать загрузчик» и path
- это «путь к файлу для модуля».