如何在 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
的 environment variable。如果在调用 Python 之前将包含 *.so
的路径添加到 PYTHONPATH
,Python 将能够找到您的库。
为此:
export PYTHONPATH="/path/that/contains/your/so":"${PYTHONPATH}"
要将此 'automatically' 应用于每个会话,您可以将此行添加到 ~/.bash_profile
或 ~/.bashrc
(参见同一参考)。在这种情况下,Python 将始终能够找到您的图书馆。
正在将您复制到 Python 路径中已有的路径
您还可以 'install' 图书馆。通常的做法是创建一个 setup.py
文件。如果设置正确,您可以使用
构建和安装您的库
python setup.py build
python setup.py install
(Python 会知道把你的图书馆放在哪里。你可以 'customize' 有点像 --user
这样的选项来使用你的主文件夹,但这似乎不是您会特别感兴趣。)
问题依旧:setup.py
怎么写?对于您的情况,您实际上可以调用 CMake。事实上,有一个例子可以做到这一点:pybind/cmake_example。您基本上可以从那里复制粘贴。
我正在尝试设置一个 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
的 environment variable。如果在调用 Python 之前将包含 *.so
的路径添加到 PYTHONPATH
,Python 将能够找到您的库。
为此:
export PYTHONPATH="/path/that/contains/your/so":"${PYTHONPATH}"
要将此 'automatically' 应用于每个会话,您可以将此行添加到 ~/.bash_profile
或 ~/.bashrc
(参见同一参考)。在这种情况下,Python 将始终能够找到您的图书馆。
正在将您复制到 Python 路径中已有的路径
您还可以 'install' 图书馆。通常的做法是创建一个 setup.py
文件。如果设置正确,您可以使用
python setup.py build
python setup.py install
(Python 会知道把你的图书馆放在哪里。你可以 'customize' 有点像 --user
这样的选项来使用你的主文件夹,但这似乎不是您会特别感兴趣。)
问题依旧:setup.py
怎么写?对于您的情况,您实际上可以调用 CMake。事实上,有一个例子可以做到这一点:pybind/cmake_example。您基本上可以从那里复制粘贴。