2017-04-13 3 views
2

私はメインファイル(main.cpp)とヘッダーファイル(nodes.hpp)を持っています。メインファイルは入力引数にN(任意の正の整数)をとり、ヘッダファイルの関数を使って 'x & y'(両方ともdouble)という出力を出力します。PythonでC++コードを折り返す(手動)

注:

  1. 両主とヘッダファイルはC++で書かれています。
  2. データ構造体を配列、ベクトルとして使用するのではなく、メインファイルとヘッダーファイルの両方で固有ライブラリを使用します。

私はPythonラッパーを書く必要があります。私はPythonの知識を持っていますが、ラッパーは一度も使用していません。

誰でも、このようなコードのpython wrpperの使用について、参考にしてください。

+0

[ドキュメントを読む](https:// docs。python.org/3/extending/index.html)には、調査できるサードパーティツールがいくつか記載されています。 – Useless

+0

最もすばらしい最新のライブラリの1つは、[pybind11](https://github.com/pybind/pybind11)です(これは毎日人気が高まっています)。多くの経験がなければ、これはサイフォン以外にも私が試した唯一のものです。 Boost.Pythonは一般的にSWIGやCOのような重いものに比べて使用するのがいいと考えられています。ブーストのビルドツールに縛られています。これは、あなたが最新のC++コンパイラを使用できるかどうかをpybind11が取り除くものです! – sascha

答えて

1

公式ドキュメントをお試しください:

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

このリンクはあなたのcppモジュールが含まれており、Pythonインタプリタからそれを使用する方法の簡単な例を提供し、またはこれが可能である場合にはCythonにしようとします:http://cython.org/

Cythonでは、CのようなPythonのようなコードを書くことができます。このコードはCPPに翻訳され、Pythonから簡単にアクセスできます。

0

あなたはすでにブーストを設定している場合、私はBoost.Pythonをお勧めしますBoost.Python

を使用するか、Pythonのnative interface

を行くことができます。

5

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ファイルa:

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) 

プロジェクトを実行するために、以下の指示に従っ:

  • は名前ビルドでディレクトリを作成します。
  • そのディレクトリに入力してください。
  • は、コマンドcmake -DCMAKE_BUILD_TYPE=Release ..
  • make
  • python MyProject.pyを与えます。これで、C++プロジェクトのメソッドが返す文字列を確認する必要があります。
  • ここ
1

があなたのオプションは次のとおりです。

  1. あなたはctypesを使用することができ、あなたはあなたのプログラムが他のソフトウェアによって呼び出すことができる共有ライブラリに変換するので、私は、これにきれいな解決策を検討し、ありませんPythonのみ。あなたは、あなた自身のプログラムのためのCインターフェイスを書く必要があります。

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

  3. SWIGを使用すると、定義したインターフェイスファイルを使用してctypesを使用して作成する必要があるインターフェイスが自動的に作成されます。人々はそれがとても良いと言いますが、文書はあまり良くありません。

  4. Boost.Pythonを使用できますが、これはうまくいきますが、bjamを使用した非常に醜いビルドシステムです。それを回避することができれば、それはctypeよりも優れています。私は大きなブーストファンですが、私はこれを使わないのです。

私は通常ctypesです。私はそれがsingle-reponsibility principleを強調しているので、それを信じています。ライブラリには、インターフェイス(Cインターフェイス)とは別のジョブがあります。このジョブは、そのインターフェイスを使用するPythonスクリプトとは別のもので、簡単な機能をユーザーに公開します。

0

C++ラッパー生成用の別のツールはCLIFです。 2017年にリリースされたGoogleでは、これをほとんどすべてのものに使用しています。新しいSWIGラッパーを内部的にPython用に作成することはできません。

それは、C++構文解析のためのクランの上に構築され、むしろあなたはSWIGの「難すべてをサポートする」アプローチを経由して足で自分自身を撮影することを可能にしようとするよりも(当然Google's Style Guide次)比較的慣用現代のC++ APIを使用する必要があります。

関連する問題