3

Ubuntu で pybind11 を使用して、C++ 関数の Python バインディングを作成する CMake プロジェクトをセットアップしようとしています。

ディレクトリ構造は次のとおりです。

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 docs のドキュメントには次の行があります

$ 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 を使用しています。

4

2 に答える 2

1

Besides the solution of setting the path in the Python script that is presented by @super, you have two more generic solutions.

Setting PYTHONPATH

There is an environment variable in Linux (and macOS) called PYTHONPATH. If you add the path that contains your *.so to the PYTHONPATH before you call Python, Python will be able to find your library.

To do this:

export PYTHONPATH="/path/that/contains/your/so":"${PYTHONPATH}"

To apply this 'automatically' for every session you can add this line to ~/.bash_profile or ~/.bashrc (see the same reference). In that case, Python will always be able to find your library.

Copying your to a path already in Python's path

You can also 'install' the library. The usual way to do this is to create a setup.py file. If set up correctly you can build and install your library using

python setup.py build
python setup.py install

(Python will know where to put your library. You can 'customize' a bit with an option like --user to use your home-folder, but this doesn't seems to be of particular interest to you.)

The question remains: How to write setup.py? For your case you can actually call CMake. In fact there exists an example that does exactly that: pybind/cmake_example. You can basically copy-paste from there.

于 2018-06-05T13:46:40.500 に答える