PythonはC++を呼び出し、PythonインターフェースをPynin d 11で作成します。


私はuuntuシステムで実験をしていますので、windowとは違っているかもしれません。
pythonはC/C++を呼び出す多くの方法があります。例えば、boots.python、swig、ctypes、pynid 11など、これらの方法は多くの簡略化されています。pynid 11の利点は、C++11に対してよくサポートされています。APIは簡単です。今はPynid 11の入門操作を簡単にメモします。
1.pylind 11プロファイルと環境インストール
pynind 11はヘッドファイルのみを含む軽量級のライブラリであり、主に既存のC+コードをベースに拡張するために使用されています。その文法と目標はBoost.Pythonに似ていますが、Boost.Pythonは既存の基本的なすべてのC+++コンパイラに対応するために非常に複雑で大きなコンパイラになります。そのために払う代価は多くの難解なテンプレートの技巧と多くの必要でない旧版のコンパイラに対する支持です。Pynid 11はこれらのサポートを破棄しています。python 2.7以上とC++11以上のコンパイラだけをサポートしています。Boost.Pythonよりも簡潔で効率的です。
pyboind 11を使用するためには、C++11標準のコンパイラ(GCC 4.8以上、VS 2015 Update 3以上)とpython 2.7以上のバージョンをサポートする必要があります。CMakeをダウンロードする必要があります。
cmake教程は参考できます。//www.jb 51.net/articale/14903 httm
  • まず、私たちはpynid 11 github URLから:https://github.com/pybind/pybind11でソースをダウンロードします。
  • cmakeプロジェクトの前に、pytest pip install pytestをインストールします。そうでないと、エラーが発生します。
  • はCMakeでコンパイルして試験用例を実行する:
  • 
      pybind11   ,
    cd tests
    cmake ..
    cmake --build . --config Release --target check
    すべてのテストケースが合格したら、インストールが成功したということです。
    2.pythonコールC++
    pyboind 11のコンパイルをダウンロードしてから、公式のpynin d 11 Tutorialに対して学習を開始します。詳しい入門教程と文法は公式文書を参照してください。
    まず、C++ソースファイルを作成します。名前はexample.cppです。
    
    #include <pybind11/pybind11.h>
    namespace py = pybind11;
    int add(int i, int j)
    {
     return i + j;
    }
    PYBIND11_MODULE(example, m)
    {
     // optional module docstring
     m.doc() = "pybind11 example plugin";
     // expose add function, and add keyword arguments and default arguments
     m.def("add", &add, "A function which adds two numbers", py::arg("i")=1, py::arg("j")=2);
     // exporting variables
     m.attr("the_answer") = 42;
     py::object world = py::cast("World");
     m.attr("what") = world;
    }
    2.1 windowでコンパイルする
    私は実験をしていませんので、他の教程を参考にしてもいいです。
    2.2 CMakeのコンパイル方法
    もちろん、CMakeを使ってコンパイルしてもいいです。まずCMakeLists.txtを書きます。
    
    cmake_minimum_required(VERSION 2.8.12)
    project(example) 
    add_subdirectory(pybind11)
    pybind11_add_module(example example.cpp)
    ここでexample.cppはpynid 11と同じレベルのディレクトリに置いてください。CMakeLists.txtで同じディレクトリのpynid 11と同じディレクトリのexample.cppファイルを呼び出しました。現在のディレクトリで実行
    
    cmake .
    make
    example.cpython-36 m-x 86_を生成します。64-linux-gnu.soファイルです。このファイルはpythonで呼び出すことができるファイルです。それとも同じディレクトリでpythonを実行して、pythonコマンドラインに入りますか?
    
    import example
    example.add(3, 4)
    [out]: 7
    
    3、中級呼び出し
    上は簡単な例です。私たちが必要な機能は複雑かもしれません。
    モデル設計ライブラリ呼び出し問題を生成します。
    例えばあなたのcppファイルに他の第三者ライブラリを引用しています。この時私達が作成したsoファイルは第三者ライブラリに依存する必要があります。
    ローカルmyopencv.cppファイル
    
    #include <pybind11/pybind11.h>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc.hpp>
    #include <string>
    namespace py = pybind11;
    void read_img(std::string img_path)
    {
     cv::Mat image = cv::imread(img_path, CV_LOAD_IMAGE_COLOR);
    }
    PYBIND11_MODULE(myopencv, m)
    {
     m.def("read_img", &read_img, "get image size");
    }
    CMakeLists.txtは以下のように書くことができます。
    
    cmake_minimum_required(VERSION 2.8.12)
    project(myopencv)
    add_subdirectory(pybind11)
    pybind11_add_module(myopencv myopencv.cpp)
    cmkaeでコンパイルして通ります。
    
    cmake .
    make
    myopencv.cpython-36 m-x 86_が発生します。64-linux-gnu.soファイル
    pythonで呼び出す
    
    import myopencv
    現在ここで問題が発見されました。まだ調整ができていません。
    データタイプが一致しない問題
    たとえばopencvはpythonでnumpyのタイプですが、c++中cv.Matのタイプです。
    opencvのタイプ不整合問題に対して,github上で解決法を示した。
    cppとhファイルダウンロード住所https://github.com/edmBernard/pybind11_opencv_numpy
    どのようにあなたは何が必要ですか?
    締め括りをつける
    以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。もっと知りたいなら、下のリンクを見てください。