2

非標準のライブラリ (私の場合は OpenCV ライブラリ) を使用する Mac に C++ コードがあり、これをコンパイルして、他のコンピューター (少なくとも他の Mac コンピューター) から呼び出すことができるようにする必要があります。Python から実行されます。だから私は3つの基本的な質問があります:

  1. Python から使用できるようにプロジェクトをコンパイルするにはどうすればよいですか? *.so ファイルを作成する必要があると読みましたが、その方法は?
  2. それはlibのように動作するはずなので、pythonはpythonレベルで選択された特定の関数を呼び出しますか?
  3. または、コマンドラインから実行されるメイン関数を含める必要がありますか?

そうする方法についてのアイデアはありますか?PS: eclipse IDE を使用して C++ プロジェクトをコンパイルしています。

乾杯、

4

5 に答える 5

2

Linux を使用している場合は、atmaere と nouney の回答が役立つ場合があります。

私の場合、MacOSX を使用しているため、cython ライブラリを使用する方法を考え出しました。物事を機能させるための簡単なチュートリアルを以下に説明します。

Python スクリプトから C++ を呼び出す方法:

  1. CYTHON のインストール: Python スクリプトを c/c++ と統合するツールである Cython をインストールするには、https://pypi.python.org/pypi/Cython/ にアクセスしてください。

  2. サンプルのダウンロード: ここから C++ 実装のサンプルをダウンロードします: http://wiki.cython.org/WrappingCPlusPlus?action=AttachFile&do=get&target=cythoncpp.tgz

  3. C++ ソース ファイルの準備: *.cpp および *.h ファイルが正しいことを確認してください。ダウンロードした例では、ファイル名は cpp_rect.h と cpp_rect.cpp です。

  4. PYTHON WRAPER CPLASS の作成: ダウンロードした例のrectangle.pyx ファイル、またはhttp://docs.cython.org/src/userguide/wrapping_CPlusPlus.html?highlight=cpp#create-cython-wrapper-で説明されているモデルに従ってクラス

  5. SETUP.PY ファイルの準備: ダウンロードしたサンプルは既にこのファイルに含まれていますが、詳細については次のチュートリアルを参照してください: http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html?highlight=cpp#specify-c -language-in-setup-py . [PS: 1 コンパイルする最も簡単な方法は、setup.py ファイルを使用して disutilis パッケージを使用することです。コンパイル オプションの詳細については、http://docs.cython.org/src/reference/compilation.html# を参照してください

  6. コンパイルを試みます: ソース ファイルと同じフォルダからターミナルに移動します。この時点で、cpp_rect.h、cpp_rect.cpp、rectangle.pyx、setup.py の 4 つのファイルが既に存在します。そこから、コマンドを実行します$ python setup.py build_ext --inplace

  7. 「gcc-4.2 を実行できません: そのようなファイルまたはディレクトリはありません」などの g++ エラーが発生した場合は、フラグ システムをハックすることができますsudo ln -s /usr/bin/gcc /usr/bin/gcc-4.2。前の手順を繰り返します。

  8. コードをテストする: この時点で、必要なものはすべて揃っています。setup.py は、rectangle.pyx と共に使用され、rectangle.so ファイルが生成されました。これが必要なものです。pythons スクリプトを作成して、統合をテストするだけです。幸いなことに、この例は、use_rect.py という名前のテスト スクリプトで既にカウントされています。

$ python userect.py" "を使用して端末から実行するだけです。

于 2013-08-23T14:04:33.767 に答える
1

SWIG を使用した例を次に示します。

C++ 関数「inflow」を呼び出す Python コード:

 import inflow    # importing C++ inflow library
 nframes = 25
 print 'calling inflow function in loop ...'
 for i in xrange(0,1001):
      z = inflow.inflow(""" arguments""")
     """ code does something with z """

C++ 関数は通常どおり次のようになります。

 #include <iostream>
 #include <vector>
  inflow(/* arguments from Python*/)
  {
   /* code does something */

  }

次に、Python とのインターフェイスを作成するための手順を次に示します。

1) 重要 - このステップでバインドしようとしている C++ コードが、コマンドで指定された名前とは異なる名前であることを確認してください。そうしないと、swig コードで上書きされます。

example_wrap.cpp が Python とインターフェースしたいファイルで、"example.i" が SWIG インターフェース ファイルだとしましょう。SWIG は、example.cpp という名前の新しいファイルを生成します。

2) swig -c++ -python -o example_wrap.cpp example.i

3) g++ -I /usr/include/python2.7 -fPIC -c example_wrap.cpp -o example_wrap.o

4) g++ -shared -o _example.so example_wrap.o

アイデアは、コンパイルされたモジュール名がアンダースコアで始まり、その後に名前が続く必要があるということです。

5) 用語で Python を開き、次のように言います。

from example import *

そして、関数の呼び出しを開始します。

6) ソース: http://www.iram.fr/~roche/code/python/SWIG.html#purpose

この例のインターフェイス ファイルは次のようになります。

 %module example
 %{
   #include "example.h"
 %}

 %include "std_vector.i"
 // Instantiate templates used by example
 namespace std {
  %template(IntVector) vector<int>;
  %template(DoubleVector) vector<double>;
  }

  // Include the header file with above prototypes
  %include "example.h"
于 2013-08-20T19:10:22.443 に答える
1
  1. boost pythonをご覧になる必要があると思います。これは素晴らしいライブラリであり、Linux、Windows、および Mac でも動作します。boost python を使用すると、Python から直接アクセスするために、クラスと関数をエクスポートできます。多くの例があり、ドキュメントは非常に優れています!!!

  2. boost python を使用して、公開する関数/クラスを定義し、ソース コードをライブラリ ファイルにコンパイルして、python 内にインポートします。

于 2013-08-26T18:45:04.817 に答える