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

pybind11:如何将pybind模块组织到命名空间包下

实现pybind11模块的命名空间包组织

1. 调整目录结构

先搭建符合Python包规范的目录结构:

项目根目录/
├── setup.py
├── mypackage/
│   ├── __init__.py
│   └── src/
│       └── main.cpp

(cpp文件路径可按需调整,只要后续setup.py中指定正确路径即可)

2. 修改setup.py核心配置

关键是将扩展模块的名称改为完整的命名空间路径,同时配置包的相关参数:

from setuptools import setup, find_packages
from pybind11.setup_helpers import Pybind11Extension

ext_modules = [
    Pybind11Extension(
        # 改为带命名空间的模块名
        "mypackage.python_example",
        ["mypackage/src/main.cpp"],  # 对应你的cpp文件实际路径
        # 保留原有的编译参数
        extra_compile_args=["-O3"],
    ),
]

setup(
    name="mypackage",  # 包名设为你的命名空间名
    version="0.1.0",
    packages=find_packages(),  # 自动识别mypackage包
    ext_modules=ext_modules,
    # 其他元信息(作者、描述等)按需补充
)

3. 可选:配置__init__.py实现类似numpy的简化调用

如果想让用户像使用np.some_function那样直接调用模块内容,在mypackage/__init__.py中添加导入逻辑:

# 将子模块的内容导入到包的顶层命名空间
from .python_example import *

# 可选:明确列出对外暴露的函数/类,避免导入冗余内容
__all__ = ["your_function", "your_class"]

4. 安装与测试

执行安装命令:

pip install .

之后即可按预期方式导入使用:

# 方式1:直接导入子模块
import mypackage.python_example as pe
pe.your_function()

# 方式2:导入包并使用顶层暴露的内容(需配置__init__.py)
import mypackage as mp
mp.your_function()

核心注意点

  • 扩展模块的名称必须遵循包名.子模块名格式,setuptools会自动将编译后的动态库安装到mypackage目录下,而非全局命名空间。
  • 若不需要简化调用,__init__.py可以为空文件,此时必须通过mypackage.python_example的完整路径导入模块。
  • 不要手动移动编译后的模块文件,完全依赖setup.py的配置控制安装路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:31:41