将pyi(类型存根文件)导入普通python模块

Ian*_*Ian 5 python import stub python-import pyi

我有一个程序(如宏),它在父程序中运行并从该程序导入一个 API 模块(让我们称之为foo)。问题是该模块仅存在于该程序中,因此我无法执行诸如在软件外部运行pydocmd之类的操作,因为该脚本会引发 ReferenceError。为了帮助我自己的开发,我foo.pyi在我的项目目录中创建了一个类型存根文件。如果导入失败,我想要做的是将该类型存根作为普通 Python 文件导入,以提供虚拟函数和属性。就像是:

try:
  import foo
except ImportError:
  from . import foo.pyi
Run Code Online (Sandbox Code Playgroud)

但是,这会引发错误,因为它试图pyifoo项目文件夹中不存在的库中导入。我能想到的唯一另一种选择是拥有 .pyi 文件的相同副本,比如“dummy_foo.py”,但我必须在一个 repo 中维护同一文件的两个副本。我宁愿不这样做。

Gra*_*ler 1

我不久前写过这篇文章;我认为应该仍然有效:

import importlib


def import_stub(stubs_path, module_name):
    sys.path_hooks.insert(0,
        importlib.machinery.FileFinder.path_hook(
            (importlib.machinery.SourceFileLoader, ['.pyi']))
    )
    sys.path.insert(0, stubs_path)
    
    try:
        return importlib.import_module(module_name)
    finally:
        sys.path.pop(0)
        sys.path_hooks.pop(0)
Run Code Online (Sandbox Code Playgroud)