web-dev-qa-db-ja.com

C ++コードをpython(手動)でラップする

メインファイル(main.cpp)とヘッダーファイル(nodes.hpp)があります。メインファイルはN(任意の正の整数)を入力引数として取り、ヘッダーファイルの関数を使用して、出力に 'x&y'(両方ともdouble)を与えます。

注:

  1. メインファイルとヘッダーファイルはどちらもC++で記述されています。
  2. 配列、ベクトルとしてデータ構造を使用する代わりに、メインファイルとヘッダーファイルの両方がEigenライブラリを利用します。

私はpythonラッパーを作成する必要があります。pythonの実用的な知識がありますが、ラッパーを使用したことがありません。

そのようなコードでpython wrpperを使用することについて、誰かが参照したりメモを付けたりできますか?

9
user7440094

Boost.Pythonを使用します。これは以前のSO Docs。


Boost.Pythonを使用

PythonプロジェクトでC++ライブラリを使用する必要がある場合、事は簡単です。Boostを使用するだけです。

まず最初に、必要なコンポーネントのリストを示します。

  • CMakeList.txtファイル。これは、CMakeを使用するためです。
  • C++プロジェクトのC++ファイル。
  • pythonファイル-これはあなたのpythonプロジェクトです。

小さなC++ファイルから始めましょう。私たちのC++プロジェクトには、「これが最初の試みです」という文字列を返すメソッドが1つだけあります。それを呼び出すCppProject.cpp

char const *firstMethod() {
    return "This is the first try.";
}

BOOST_PYTHON_MODULE(CppProject) {
    boost::python::def("getTryString", firstMethod); // boost::python is the namespace
}

以下にCMakeLists.txtファイルを用意します。

cmake_minimum_required(VERSION 2.8.3)
FIND_PACKAGE(PythonInterp)
FIND_PACKAGE(PythonLibs)
FIND_PACKAGE(Boost COMPONENTS python)

INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})

PYTHON_ADD_MODULE(NativeLib CppProject)
FILE(COPY MyProject.py DESTINATION .) # See the whole tutorial to understand this line

チュートリアルのこの部分では、すべてがとても簡単です。 pythonプロジェクトでライブラリをインポートしてメソッドを呼び出すことができます。pythonプロジェクトを呼び出しますMyProject.py

import NativeLib
print (NativeLib.getTryString)

プロジェクトを実行するには、以下の手順に従ってください:

  • buildという名前のディレクトリを作成します。
  • そのディレクトリに移動します。
  • コマンドcmake -DCMAKE_BUILD_TYPE=Release ..
  • make
  • python MyProject.py。ここで、C++プロジェクトのメソッドが返す文字列を確認する必要があります。
7
Onur Tuna

オプションは次のとおりです。

  1. ctypes を使用できます。これは、Pythonだけでなく、他のソフトウェアからも呼び出せる共有ライブラリにプログラムを変換するので、これが最もクリーンな解決策であると考えています。ただし、プログラムのCインターフェースを自分で作成する必要があります。

  2. Python C-Extension を使用できます。これは非常に低レベルであり、メモリリークが発生しやすく、1つの関数を実装するのに多くの時間を要し、Pythonバージョンであるため、これを最悪の解決策と見なします依存。基本的に、これはC++内でPythonインタプリタを開始するのに適しています。PyObjects(Pythonタイプの主要なビルディングブロック)を作成して、それらはインディーC/C++です。

  3. [〜#〜] swig [〜#〜] を使用できます。この場合、定義したインターフェイスファイルを通じて、ctypesで作成する必要のあるインターフェイスが自動的に作成されます。人々はそれはとても良いと言いますが、ドキュメントはそれほど良くありません。

  4. Boost.Python を使用できますが、これは優れていますが、bjamを使用した非常に醜いビルドシステムです。これをバイパスすることができれば、ctypesよりも優れています。私は大きな後押しファンですが、bjamは私がこれを使用しない理由です。

私が通常行うことはctypesです。 単一の責任の原則 を強調しているので、私はそれを信頼しています。ライブラリには、インターフェイス(Cインターフェイス)とは別のジョブがあります。これは、そのインターフェイスを使用し、「簡単な機能」をユーザーに公開するPythonスクリプトからも分離されています。

C++ラッパー生成のための別のツールは [〜#〜] clif [〜#〜] です。 2017年にリリースされたGoogleは、最近このほとんどすべてにこれを使用しています。 Python内部で新しいSWIGラッパーを作成することはできなくなりました。

これはC++解析のためにClangの上に構築されており、SWIGの「サポート」を介して自分自身を撃ち抜こうとするのではなく、比較的慣用的な最新のC++ APIの使用(当然ながら Googleのスタイルガイド )を必要とします。すべての貧弱な」アプローチ。

2
gps

公式ドキュメントで試してください:

https://docs.python.org/2/extending/extending.html

このリンクは、cppモジュールをインクルードし、pythonインタープリターから使用する方法の簡単な例を提供します。または、これが可能な場合は、Cythonで試してください: http:// cython。 org /

Cythonを使用すると、CライクなPythonライクなコードを記述でき、CPPコンパイルに変換され、Pythonから簡単にアクセスできるようになります。

1
mucka

Boost.Python を使用できます

またはPython native interface

すでにBoostを設定している場合は、Boost.Pythonをお勧めします。

0
mutantkeyboard