首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何导入我合并到python模块中的pybind模块?

如何导入我合并到python模块中的pybind模块?
EN

Stack Overflow用户
提问于 2022-07-19 16:00:12
回答 1查看 278关注 0票数 0

我已经创建了一个python模块,它具有以下结构(松散地基于这个例子):

代码语言:javascript
复制
module_name
├── LICENSE
├── README.md
├── module_name
│   ├── __init__.py
│   └── submodule_name
│       ├── __init__.py
│       └── submodule_name.py
├── setup.py
└── src
    └── sq.cpp

我可以运行setup.py并安装这个模块,没有问题。我还可以导入纯python模块:

代码语言:javascript
复制
import module_name
import module_name.submodule_name

对于sq.cpp,我在setup.py中有以下内容

代码语言:javascript
复制
from pybind11 import get_cmake_dir
from pybind11.setup_helpers import Pybind11Extension, build_ext


ext_modules = [
    Pybind11Extension("sq",
    ["src/sq.cpp"],),
]

sq.cpp将pybind模块定义为

代码语言:javascript
复制
PYBIND11_MODULE(sq, m)
{
    m.doc() = "a function";
    m.def("sq", &sq, "a function");
}

此时,我对如何在sq.cpp中加载模块感到困惑。我试过import sqimport module_name.sqimport sq.sq,但是都得到了ModuleNotFoundError。我遗漏了什么?我应该如何导入pybind模块?我的结构有问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-23 07:33:21

您的构建应该会失败,因为模块和函数的名称是相同的。(看看sq.cpp)当您用PYBIND11_MODULE(sq, m)定义一个模块时,sq变成一个局部变量,&sq将返回到另一个对象,而不是sq函数。因此,您可以重命名该函数的名称,以将模块名保留为sq

代码语言:javascript
复制
#include <pybind11/pybind11.h>

void _sq() {}

PYBIND11_MODULE(sq, m) {

    m.doc() = "a function";
    m.def("sq", &_sq, "a function");
}

将下面的setup.py与您的比较

代码语言:javascript
复制
import sys

from pybind11 import get_cmake_dir
from pybind11.setup_helpers import Pybind11Extension, build_ext
from setuptools import setup

__version__ = "0.0.1"

ext_modules = [
    Pybind11Extension("sq",
                      ["src/sq.cpp"],
                      define_macros=[('VERSION_INFO', __version__)],
                      ),
]

setup(
    name="sq",
    version=__version__,
    ext_modules=ext_modules,
    cmdclass={"build_ext": build_ext},
    zip_safe=False,
    python_requires=">=3.6",
)

安装模块

重定向到sq模块目录的父目录,并执行以下命令。

代码语言:javascript
复制
python3 -m pip install ./sq

导入模块

代码语言:javascript
复制
import sq

sq.sq()

编辑注释

我有点困惑,因为我已经有了一个关于setupname="module_name"部分。如何将sq模块嵌入整个module_name模块?

应该通过更改模块名来更改模块名。

  • Pybind11Extension("sq", ...)Pybind11Extension("module_name", ...)
  • setup(name="sq", ...)setup(name="module_name", ...)
  • PYBIND11_MODULE(sq, m)PYBIND11_MODULE(module_name, m)

使用上面的命令重新安装模块之后,您可以通过以下方式使用sq函数。

代码语言:javascript
复制
import module_name
from module_name import sq

module_name.sq()
sq()
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73040171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档