gpt4 book ai didi

c++17 - Python 绑定(bind)使用 pybind11 和 std::filesystem 作为函数参数给出 TypeError

转载 作者:行者123 更新时间:2023-12-04 01:44:09 25 4
gpt4 key购买 nike

我有一个类 Foo() 并且类 Foo() 有一个具有以下声明的函数:
bool Foo::copyFile(const std::filesystem::path& src, const std::filesystem::path& dest)
要求是类 Foo 应该具有 Python 绑定(bind)。我正在使用 pybind11 创建 Python 绑定(bind)。

我编写了以下内容来创建 Python 绑定(bind):

#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include "Foo.h"

namespace py = pybind11;

PYBIND11_MODULE(TestModule, m) {
py::class_ <Foo>(m, "Foo")
.def(py::init())
.def("copyFile",&Foo::copyFile);
};

这可以编译,我可以创建 Python 绑定(bind) pyd 文件。
当我使用 Foo 类的 Python 绑定(bind)时,使用:
from TestModule import Foo

f = Foo()
ret = f.copyFile("C:\Users\csaikia\Downloads\testfile_src", "C:\Users\csaikia\Downloads\testfile_dest")

它给出了一个 TypeError。我怀疑它与 pybind11 对 c++17 中 std::filesystem 的支持有关,因为我没有看到具有 std::string 的类的其他函数发生这种情况。或 std::vector .

我得到的错误是:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: copyFile(): incompatible function arguments. The following argument types are supported:
1. (self: TestModule.Foo, arg0: std::filesystem::path, arg1: std::filesystem::path) -> bool

Invoked with: <TestModule.Foo object at 0x0000000002A33ED8>, 'C:\\Users\\csaikia\\Downloads\\testfile_src', 'C:\\Users\\csaikia\\Downloads\\testfile_dest'

Did you forget to `#include <pybind11/stl.h>`? Or <pybind11/complex.h>,
<pybind11/functional.h>, <pybind11/chrono.h>, etc. Some automatic
conversions are optional and require extra headers to be included
when compiling your pybind11 module.

我是 pybind11 的新手。有人可以帮我解决这个问题吗?

最佳答案

从我与 pybind11 开发人员的对话中:

“Pybind 不知道如何将 py::str 转换为 std::filesystem::path 。没有可用的施法者,也没有绑定(bind) std::filesystem::path 类。

最简单的方法是不绑定(bind) Foo::copyFile直接地。而是绑定(bind)一个接受 const Foo& 的 lambda和 const std::string&作为参数,然后你可以传递std::stringcopyFile在哪里 std::filesystem::path预期,让 C++ 隐式转换发生。

你也可以做py::class_<std::filesystem::path>并绑定(bind)std::string转换器,然后使用 py::implicitly_convertible让所有 C++ 隐式构造都发生在 python 端,但是……嗯,工作量太大了。”

它就像一个魅力!

关于c++17 - Python 绑定(bind)使用 pybind11 和 std::filesystem 作为函数参数给出 TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56009999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com