python 如何打包链接到 dll (.so) 文件

how does python package links to dll (.so) files

我正在基于 this 存储库创建一个 python 包。当我使用 setup.py 和 运行 pip install . 构建软件包时,该软件包有几个 cpp 文件编译,这会在我的软件包安装目录中生成 _C.cpython-36m-x86_64-linux-gnu.so 文件。要导入此 dll (.so) 文件,我所要做的就是

from . import _C(类似 this

现在导入的_C对象指向_C.cpython-36m-x86_64-linux-gnu.so。我不明白 _C 对象如何链接到特定的 .so 文件。在构建包时,该信息是否写入任何元数据文件?

没有。处理 C++ 库加载的机制由 pybind 完成。在文档 (https://pybind11.readthedocs.io/en/stable/basics.html) 中,您会看到为了导入使用 pybind API 构建的 C++ 库,.py 文件中的正确语法是导入 前缀 的图书馆。因此,当您在 linux 系统上的 python 代码中写入 import _C 时,它将查找 _C.<whatever>.so 并从该文件加载符号。

您引用的回购中用于构建 import-able python 模块的所有 C++ 文件最终都包含 torch/extension.h(通过 vision.h --- https://github.com/microsoft/scene_graph_benchmark/blob/main/maskrcnn_benchmark/csrc/cuda/vision.h#L3) and if you explore the source for pytorch, extension.h includes python.h which includes pybind.h (https://pytorch.org/cppdocs/api/program_listing_file_torch_csrc_api_include_torch_python.h.html).