簡體   English   中英

如何導入我合並到我的 python 模塊中的 pybind 模塊?

[英]How do I import the pybind module I incorporated into my python module?

我創建了一個具有以下結構的 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 sqimport module_name.sqimport sq.sq ,但都導致ModuleNotFoundError 我錯過了什么? 我應該如何導入 pybind 模塊? 我的結構錯了嗎?

由於模塊和函數的名稱相同,您的構建應該會失敗。 (查看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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM