gpt4 book ai didi

python - pybind11 模块目录

转载 作者:行者123 更新时间:2023-12-02 10:00:06 25 4
gpt4 key购买 nike

我正在使用 pybind11 编写一个 python 模块,它将成为一个库。
在我的 C++ 代码中的某个时刻,我需要知道我的 .so/.dll 模块的绝对路径(我需要它来访问包含我的模块的包内的子目录中的某些文件)。
我试图访问 __file__以这种方式属性:

namespace py = pybind11;

std::string path;

std::string getPath() {
return path;
}

PYBIND11_MODULE(mymodule, m) {
path = m.attr("__file__").cast<std::string>();
//use path in some way to figure out the path the module...


m.def("get_path", &getPath);
}
但我得到了错误
ImportError: AttributeError: module 'mymodule' has no attribute '__file__'
有没有办法知道用pybind11编写的模块的绝对路径?

最佳答案

如果您仅从 C++ 运行,假设您的模块名为 example,这应该可以工作。并且可以在 pythonpath 上找到。

#include <pybind11/embed.h>

namespace py = pybind11;


void getModulePath()
{
py::scoped_interpreter guard{}; // start the interpreter and keep it alive
py::object example = py::module::import("example");
return example.attr("__file__").cast<std::string>();
}
如果您的应用程序是从 python 内部运行的,我认为以下应该可以工作
#include <pybind11/pybind11.h>

namespace py = pybind11;


void getModulePath()
{
py::gil_scoped_acquire acquire;
py::object example = py::module::import("example");
return example.attr("__file__").cast<std::string>();
}
这是有效的,因为我们使用 python 解释器来导入示例模块,所以 __file__属性将被设置

关于python - pybind11 模块目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63039814/

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