Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I import a module created with pybind11 on Ubuntu

I am trying to setup a CMake project that creates python bindings for its c++ functions using pybind11 on Ubuntu.

The directory structure is:

pybind_test
    arithmetic.cpp
    arithmetic.h
    bindings.h
    CMakeLists.txt
    main.cpp
    pybind11 (github repo clone)
        Repo contents (https://github.com/pybind/pybind11)

The CMakeLists.txt file:

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})

The repository builds successfully and the file arithmetic.cpython-36m-x86_64-linux-gnu.so is produced. How do I import this shared object file into python?

The documentation in the pybind11 docs has this line

$ c++ -O3 -Wall -shared -std=c++11 -fPIC `python3 -m pybind11 --includes` example.cpp -o example`python3-config --extension-suffix`

but I want to build using CMake and I also don't want to have to specify extra include directories every time I run python to use this module.

How would I import this shared object file into python like a normal python module?

I am using Ubuntu 16.04.

like image 232
Airfield20 Avatar asked Oct 18 '25 14:10

Airfield20


1 Answers

If you open a terminal, go to the directory where arithmetic.cpython-36m-x86_64-linux-gnu.so is located and run python followed by import arithmetic the module will get imported just like any other module.

Another options is to use the method of

import sys

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

With this method you can use both relative and absolute path.

like image 85
super Avatar answered Oct 21 '25 03:10

super