如何让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自动包含文件
- 在项目根目录创建
MANIFEST.in文件,添加如下内容:
include my_pkg.pyi
- 修改
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
相关产品推荐
相关产品推荐

