我的 Python 多模块包不会随 py.typed 文件一起分发

My Python multi-module package won't distribute with a py.typed file

我已经为 Pip 创建了一个包,其中包含多个模块,我正在将其用于其他一些项目。在其中一个项目中,我最近添加了 MyPy,因为 Pylance 缺少一些潜在的错误,但是当我导入这些模块时,MyPy 将它们标记为错误,因为它们缺少 py.typed 文件。我已经将这些文件之一添加到每个子模块中,因此目录结构如下:

* MyRepo:
    * src
    |   * modulea
    |   |   * __init__.py
    |   |   * modulea.py
    |   |   * py.typed
    |   * moduleb
    |   |   * __init__.py
    |   |   * moduleb.py
    |   |   * py.typed
    * setup.cfg

我还在 setup.cfg 中指定要包含包数据,使用 include_package_data = True 标志。

[metadata]
# Other details

[options]
packages = find:
package_dir =
    =src
python_requires = >=3.9.1
include_package_data = True

[options.packages.find]
where = src

然而,当我分发包时,它不包含任何 py.typed 文件。我不知道这是为什么,考虑到当我使用 pip install -e . 手动安装它时,我没有收到任何错误,这尤其令人困惑。我非常感谢任何解决此问题的帮助,因为我完全被难住了。

我不是 100% 确定这是正确的,因为我面前没有包裹,但我会尝试一下。

我相信由于 py.typed 不是 Python 文件,您需要明确指定要包含它。为此,在您的顶级包中,您需要 MANIFEST.in. See the MANIFEST.in link 作为通常默认包含在包分发中的默认文件 - py.typed 不在其中。在 MANIFEST.in 文件中,您可以编写如下一行:

global-include py.typed

我相信 include_package_data 设置为 true 会导致包管理器查看 MANIFEST.in 以查找任何其他需要分发的非 python 文件的文件。

我可能还会考虑在 src 目录中包含 init.py,然后在那里只有一个 py.typed 文件。