如何在 Ubuntu 上导入使用 pybind11 创建的模块

How do I import a module created with pybind11 on Ubuntu

本文关键字:pybind11 创建 模块 导入 Ubuntu      更新时间:2023-10-16

我正在尝试设置一个CMake项目,该项目使用Ubuntu上的pybind11为其c ++函数创建python绑定。

目录结构为:

pybind_test
arithmetic.cpp
arithmetic.h
bindings.h
CMakeLists.txt
main.cpp
pybind11 (github repo clone)
Repo contents (https://github.com/pybind/pybind11)

CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.10)
project(pybind_test)
set(CMAKE_CXX_STANDARD 17)
find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
include_directories(pybind11/include/pybind11)
add_executable(pybind_test main.cpp arithmetic.cpp)
add_subdirectory(pybind11)
pybind11_add_module(arithmetic arithmetic.cpp)
target_link_libraries(pybind_test ${PYTHON_LIBRARIES})

存储库成功构建并生成文件arithmetic.cpython-36m-x86_64-linux-gnu.so。如何将此共享对象文件导入 python?

pybind11 文档中的文档有这一行

$ c++ -O3 -Wall -shared -std=c++11 -fPIC `python3 -m pybind11 --includes` example.cpp -o example`python3-config --extension-suffix`

但是我想使用 CMake 构建,我也不想每次运行 python 来使用此模块时都必须指定额外的包含目录。

如何像普通的 python 模块一样将此共享对象文件导入 python?

我正在使用 Ubuntu 16.04。

如果您打开终端,请转到arithmetic.cpython-36m-x86_64-linux-gnu.so所在的目录并运行python然后import arithmetic模块将像任何其他模块一样导入。

另一种选择是使用

import sys
sys.path.insert(0, 'path/to/directory/where/so-file/is')
import arithmetic

使用此方法,您可以同时使用相对路径和绝对路径。

除了 @super 提供的在 Python 脚本中设置路径的解决方案之外,您还有两个更通用的解决方案。

设置 PYTHONPATH

Linux(和macOS(中有一个环境变量称为PYTHONPATH。如果在调用 Python 之前将包含*.so的路径添加到PYTHONPATH,Python 将能够找到您的库。

为此:

export PYTHONPATH="/path/that/contains/your/so":"${PYTHONPATH}"

要为每个会话"自动"应用此行,您可以将此行添加到~/.bash_profile~/.bashrc(请参阅同一参考(。在这种情况下,Python 将始终能够找到您的库。

将你的复制到 Python 路径中已有的路径

您也可以"安装"库。执行此操作的常用方法是创建一个setup.py文件。如果设置正确,您可以使用以下方法构建和安装库

python setup.py build
python setup.py install

(Python会知道把你的库放在哪里。您可以使用诸如--user之类的选项来"自定义"一下,以使用您的主文件夹,但这似乎对您来说并不特别感兴趣。

问题仍然存在:如何写setup.py?对于您的情况,您实际上可以致电CMake。事实上,有一个例子正是这样做的:pybind/cmake_example。您基本上可以从那里复制粘贴。