使用 setuptools 和存根文件打包 C++ 扩展

Asp*_*t11 5 c++ python setuptools python-packaging python-poetry

所以我有以下文件结构:

\n
project/\n\xe2\x94\x9c\xe2\x94\x80 cpp_src/\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 src/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 cpp source files\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 test/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 cpp test files\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 stub.pyi\n\xe2\x94\x9c\xe2\x94\x80 python_src/\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 ...\n\xe2\x94\x9c\xe2\x94\x80 build.py\n
Run Code Online (Sandbox Code Playgroud)\n

在我的build.py文件中,我使用 setuptools 使用cpp_src自定义build_ext命令来编译和打包 C++ 扩展。但是,我似乎无法让它包含存根文件stub.pyi。如何修改 setuptools 命令来执行此操作?我不太关心文件结构,所以如果setup.py中需要另一个文件cpp_src,那很好。

\n

如果有帮助的话,我还使用 Poetry 来管理虚拟环境。此外,如果有另一个构建系统可以使这变得更容易,我很乐意使用它。

\n

谢谢。

\n

编辑:这是该文件的简化版本build.py(完整存储库位于https://github.com/Aspect1103/Hades/tree/ Generation- rust ):

\n
project/\n\xe2\x94\x9c\xe2\x94\x80 cpp_src/\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 src/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 cpp source files\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 test/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 cpp test files\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 stub.pyi\n\xe2\x94\x9c\xe2\x94\x80 python_src/\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 ...\n\xe2\x94\x9c\xe2\x94\x80 build.py\n
Run Code Online (Sandbox Code Playgroud)\n

Dan*_*nes 0

我不认为目前有一种方法可以.pyi直接.so在文件结构中安装文件,但是您可以利用PEP 561 的仅存根包在存储库中创建一个单独的包,其中仅包含您的存根,然后将安装该包并得到兼容 IDE 的认可。

  • 在您的存储库中创建一个必须专门调用的新目录my_pkg-stubs(根据PEP 561
  • 重命名my_pkg.pyimy_pkg-stubs/__init__.pyi
  • 在您的 中setup.py,添加my_pkg-stubs软件包,并确保该.pyi文件将包含在发行版中:
...
    packages=[..., 'my_pkg-stubs'],
    include_package_data=True,
    package_data={"my_pkg-stubs": ["*.pyi"]},
...
Run Code Online (Sandbox Code Playgroud)

my_pkgmy_pkg-stubs都安装时,符合 PEP561 的 IDE 将查找my_pkg-stubs类型提示并自动显示它们。我已在应用此过程的存储库上使用 Visual Studio Code 验证了此行为。