我正在尝试设置一个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。
发布于 2018-06-04 20:35:12
如果打开一个终端,转到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使用此方法,您可以同时使用相对路径和绝对路径。
发布于 2018-06-05 13:46:40
除了在@Super所提供的Python脚本中设置路径的解决方案之外,您还有两个更通用的解决方案。
设置PYTHONPATH
在Linux (和macOS)中有一个名为PYTHONPATH的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。事实上,有一个例子就是这样做的:示例。你基本上可以从那里复制粘贴。
https://stackoverflow.com/questions/50688184
复制相似问题