首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何导入在Ubuntu上使用pybind11创建的模块

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

Stack Overflow用户
提问于 2018-06-04 20:20:06
回答 2查看 9.2K关注 0票数 3

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

目录结构是:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
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文档中的文档有以下一行

代码语言:javascript
复制
$ 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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-04 20:35:12

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

另一个选项是使用

代码语言:javascript
复制
import sys

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

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

票数 4
EN

Stack Overflow用户

发布于 2018-06-05 13:46:40

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

设置PYTHONPATH

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

为此,请执行以下操作:

代码语言:javascript
复制
export PYTHONPATH="/path/that/contains/your/so":"${PYTHONPATH}"

要将此“自动”应用于每个会话,您可以将这一行添加到~/.bash_profile~/.bashrc (参见相同的引用)。在这种情况下,Python将始终能够找到您的库。

将您复制到Python路径中已经存在的路径

您还可以“安装”库。通常的方法是创建一个setup.py文件。如果设置正确,则可以使用

代码语言:javascript
复制
python setup.py build
python setup.py install

(Python将知道在哪里放置库。您可以使用像--user这样的选项“定制”一些来使用您的主文件夹,但这似乎不是您特别感兴趣的。)

问题仍然存在:如何编写setup.py?对于您的情况,您实际上可以调用CMake。事实上,有一个例子就是这样做的:示例。你基本上可以从那里复制粘贴。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50688184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档