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__ 属性将被设置