pybind11模块的目录
Directory of pybind11 module
我正在编写一个 python 模块,它将成为一个库,使用 pybind11。
在我的 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
并且可以在 python 路径中找到,这应该可以工作。
#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。
在我的 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
并且可以在 python 路径中找到,这应该可以工作。
#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__
属性将被设置