Относительный импорт python

Я теряю рассудок над этим. Он прошел половину года, и я все еще пытаюсь вычислить относительный импорт библиотеки python.

Я запускаю python2.7 и интерпретатор python3.5 и notepad ++ с плагином NPP_EXEC, и я стараюсь не использовать внешние библиотеки, прежде чем я понимаю каждую библиотеку внутри папки python / lib, конечно, мои собственные библиотеки не учитываются.

Я googled и исследовал черту из этой темы, и большинство ответов – «use -m / -c switch», что хорошо, но я не могу использовать эти ключи внутри скрипта, только с консоли.

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

Я открыл файл pkgutil.py и увидел, что там в функции iter_importers следующий код:

python27

def iter_importers(fullname=""): """Yield PEP 302 importers for the given module name If fullname contains a '.', the importers will be for the package containing fullname, otherwise they will be importers for sys.meta_path, sys.path, and Python's "classic" import machinery, in that order. If the named module is in a package, that package is imported as a side effect of invoking this function. Non PEP 302 mechanisms (eg the Windows registry) used by the standard import machinery to find files in alternative locations are partially supported, but are searched AFTER sys.path. Normally, these locations are searched BEFORE sys.path, preventing sys.path entries from shadowing them. For this to cause a visible difference in behaviour, there must be a module or package name that is accessible via both sys.path and one of the non PEP 302 file system mechanisms. In this case, the emulation will find the former version, while the builtin import mechanism will find the latter. Items of the following types can be affected by this discrepancy: imp.C_EXTENSION, imp.PY_SOURCE, imp.PY_COMPILED, imp.PKG_DIRECTORY """ if fullname.startswith('.'): raise ImportError("Relative module names not supported") if '.' in fullname: ## this is what got me to depression stage # Get the containing package's __path__ pkg = '.'.join(fullname.split('.')[:-1]) if pkg not in sys.modules: __import__(pkg) path = getattr(sys.modules[pkg], '__path__', None) or [] else: for importer in sys.meta_path: yield importer path = sys.path for item in path: yield get_importer(item) if '.' not in fullname: yield ImpImporter() 

python35

 def iter_importers(fullname=""): """Yield PEP 302 importers for the given module name If fullname contains a '.', the importers will be for the package containing fullname, otherwise they will be all registered top level importers (ie those on both sys.meta_path and sys.path_hooks). If the named module is in a package, that package is imported as a side effect of invoking this function. If no module name is specified, all top level importers are produced. """ if fullname.startswith('.'): msg = "Relative module name {!r} not supported".format(fullname) raise ImportError(msg) if '.' in fullname: # Get the containing package's __path__ pkg_name = fullname.rpartition(".")[0] pkg = importlib.import_module(pkg_name) path = getattr(pkg, '__path__', None) if path is None: return else: yield from sys.meta_path path = sys.path for item in path: yield get_importer(item) 

Так как в файле pkgutil.py в iter_imports stats, если fullname начинается с '.' это вызовет ошибку, не вычисляя что-либо, что мне кажется, что относительный импорт не существует на языке python (что является позором), но тогда я запутался, потому что официальная страница python заявляет, что относительный импорт возможен PEP 328 , но как это делается ускользает от официальной страницы, он просто описывает процессы без каких-либо структурных файлов.

Если кто-то может использовать относительный импорт с python, я был бы очень благодарен, если sed может сделать следующее:

описать минимальные требования для относительного импорта:

  • структура папки
  • структура файла init.py и main .py (если это необходимо), так как я знаю, что структура файла инициализации может варьироваться от кода к коду, я думаю, что лучший синтаксис был бы следующим: некоторые примеры all = список строк для всех имен функций loader = если переопределить объект SourceFileLoader (вы можете найти его в% path%) и т. д. и т. д.
  • управление маршрутом (если требуется) минимальное использование и то, как это делается
  • и поскольку я не знаю, как относительный импорт, пожалуйста, опишите свои успехи в этом.

Я делаю это, потому что я надеюсь, что если кто-нибудь сможет ответить на этот вопрос, он поможет любому newb, как я, и любому другому человеку, который только начинается с python, использовать эту удивительную функцию python (если она существует) и, следовательно, не повторять этот вопрос.