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

时间:2018-06-04 20:20:06

标签: python c++ linux cmake pybind11

我正在尝试设置一个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使用此模块时都必须指定额外的include目录。

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

我正在使用Ubuntu 16.04。

2 个答案:

答案 0 :(得分:1)

如果您打开终端,请转到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

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

答案 1 :(得分:1)

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

设置PYTHONPATH

Linux(和macOS)中有一个名为PYTHONPATH的{​​{3}}。如果在调用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。事实上,存在一个确实如此的例子:environment variable。你基本上可以从那里复制粘贴。