如何在 Ubuntu 上导入使用 pybind11 创建的模块
How do I import a module created with pybind11 on Ubuntu
我正在尝试设置一个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。您基本上可以从那里复制粘贴。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- Pybind11:将元组列表从Python传递到C++
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在 Ubuntu 上导入使用 pybind11 创建的模块
- Pybind11:创建数据的numpy视图