You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让pybind11模块打包时自动将.pyi存根文件安装到site-packages?

问题:pybind11模块打包时无法自动包含.pyi存根文件

项目结构:

my-pkg/
    setup.py
    my_pkg.pyi
    my_pkg/
        src/
            my_cpp_files.cpp

原setup.py内容:

# setup.py

from glob import glob
from setuptools import setup
from pybind11.setup_helpers import Pybind11Extension

ext_modules = [
    Pybind11Extension("my_pkg", sorted(glob("src/*.cpp")), include_dirs=['./'], cxx_std=17),
]

setup(
    name='my-pkg',
    description='This is my package',
    version='1.0.0',
    ext_modules=ext_modules,
)

打包后,site-packages目录仅包含扩展模块的.so文件和dist-info目录,my_pkg.pyi存根文件未被自动安装——手动复制该文件到site-packages后,IDE可正常识别。此前尝试的以下配置均无效:

  • data_files=[('.', ['my_pkg.pyi'])]
  • package_data={'.': ['my_pkg.pyi']}
  • package_data={'my_pkg': ['my_pkg.pyi']}
解决方案

方法一:通过sysconfig指定存根文件安装路径

修改setup.py,利用sysconfig获取site-packages的准确路径,将存根文件作为数据文件安装到该目录:

# setup.py

from glob import glob
import sysconfig
from setuptools import setup
from pybind11.setup_helpers import Pybind11Extension

ext_modules = [
    # 修正路径:原glob("src/*.cpp")无法找到文件,需改为my_pkg/src/*.cpp
    Pybind11Extension("my_pkg", sorted(glob("my_pkg/src/*.cpp")), include_dirs=['./'], cxx_std=17),
]

# 获取site-packages的绝对路径
site_packages_dir = sysconfig.get_path('purelib')

setup(
    name='my-pkg',
    description='This is my package',
    version='1.0.0',
    ext_modules=ext_modules,
    data_files=[(site_packages_dir, ['my_pkg.pyi'])]
)

方法二:配合MANIFEST.in自动包含文件

  1. 在项目根目录创建MANIFEST.in文件,添加如下内容:
include my_pkg.pyi
  1. 修改setup.py,启用自动包含数据文件并配置data_files:
# setup.py

from glob import glob
from setuptools import setup
from pybind11.setup_helpers import Pybind11Extension

ext_modules = [
    Pybind11Extension("my_pkg", sorted(glob("my_pkg/src/*.cpp")), include_dirs=['./'], cxx_std=17),
]

setup(
    name='my-pkg',
    description='This is my package',
    version='1.0.0',
    ext_modules=ext_modules,
    include_package_data=True,
    data_files=[('', ['my_pkg.pyi'])]
)

为什么之前的配置无效?

  • data_files=[('.', ['my_pkg.pyi'])]中的.指向的是系统安装前缀(如/usr/local),而非site-packages目录,因此文件会被安装到错误位置。
  • package_data仅对包含__init__.py的标准Python包生效,当前项目的my_pkg是扩展模块名称,并非Python包目录,因此该配置无法识别存根文件。

内容的提问来源于stack exchange,提问作者Matt Lyon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:26:05