我已经创建了一个python模块,它具有以下结构(松散地基于这个例子):
module_name
├── LICENSE
├── README.md
├── module_name
│ ├── __init__.py
│ └── submodule_name
│ ├── __init__.py
│ └── submodule_name.py
├── setup.py
└── src
└── sq.cpp我可以运行setup.py并安装这个模块,没有问题。我还可以导入纯python模块:
import module_name
import module_name.submodule_name对于sq.cpp,我在setup.py中有以下内容
from pybind11 import get_cmake_dir
from pybind11.setup_helpers import Pybind11Extension, build_ext
ext_modules = [
Pybind11Extension("sq",
["src/sq.cpp"],),
]sq.cpp将pybind模块定义为
PYBIND11_MODULE(sq, m)
{
m.doc() = "a function";
m.def("sq", &sq, "a function");
}此时,我对如何在sq.cpp中加载模块感到困惑。我试过import sq,import module_name.sq,import sq.sq,但是都得到了ModuleNotFoundError。我遗漏了什么?我应该如何导入pybind模块?我的结构有问题吗?
发布于 2022-07-23 07:33:21
您的构建应该会失败,因为模块和函数的名称是相同的。(看看sq.cpp)当您用PYBIND11_MODULE(sq, m)定义一个模块时,sq变成一个局部变量,&sq将返回到另一个对象,而不是sq函数。因此,您可以重命名该函数的名称,以将模块名保留为sq。
#include <pybind11/pybind11.h>
void _sq() {}
PYBIND11_MODULE(sq, m) {
m.doc() = "a function";
m.def("sq", &_sq, "a function");
}将下面的setup.py与您的比较
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模块目录的父目录,并执行以下命令。
python3 -m pip install ./sq导入模块
import sq
sq.sq()编辑注释
我有点困惑,因为我已经有了一个关于
setup的name="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函数。
import module_name
from module_name import sq
module_name.sq()
sq()https://stackoverflow.com/questions/73040171
复制相似问题