python呼び出しcの関数

4602 ワード

python呼び出しcの関数
環境:vs 2017,python 3.6 URL:pythonにc++拡張を追加
環境の設定
python環境
  • ダウンロードvs 2017、URL:vs 2017コミュニティ版
  • インストールvs 2017、注意:オンラインインストール時にpythonをインストールすることを選択し、python 3をデフォルトでインストールする.6
  • vs 2017->ビュー->その他のウィンドウ->python環境
      : python3.6       ,   python3.6       ,    ,   “ ”      ->          
    
  • を開く
  • ファイル->新規->プロジェクト->Python->Pythonアプリケーション->名前、場所
  • 右クリック[ソリューションcamera]->追加->新規プロジェクト->Visual C+->一般->空のプロジェクト->名前、場所
  • 右クリック[c++アイテム]->追加->新規アイテム->C++ファイル->名前、場所
  • 右クリック「c++プロジェクト」->プロパティ->構成プロパティ(ピクチャの追加)、pythonの追加ディレクトリ、依存ライブラリディレクトリ、ライブラリ名
  • 右クリック[c++プロジェクト]->プロパティ->一般->ターゲットファイル名(pythonライブラリ名を生成)、ターゲットファイル拡張子(.pyd)、プロパティ->一般->プロジェクトデフォルト->構成タイプ->ダイナミックライブラリ(.dll).
    コード実装
    c++コード
    #include 
    #include 
    using namespace std;
    vector<int>images_data;
    for(int i=0;i<5;i++){
        images_data.push_back(i);
    }
    //   ("i"    )
    PyObject* get_image_size(PyObject* self, PyObject* o)
    {   
        int length = images_data.size();
        return Py_BuildValue("i", length);
    }
    //   , vector  tuple
    PyObject* get_image_data(PyObject* self, PyObject* o)
    {
        PyObject* tuple = PyTuple_New(images_data.size());
        for (int i = 0; i < images_data.size(); i++) {
            PyTuple_SetItem(tuple, i, Py_BuildValue("i", images_size[i]));
        }
        return tuple;
    }
    //  
    PyObject* camera_lock(PyObject* self, PyObject* o) {
        images_data.lock();
        return o;
    }
    //  
    PyObject* camera_unlock(PyObject* self, PyObject* o) {
        images_data.unlock();
        return o;
    }
    //             
    static PyMethodDef panoramamodule_methods[] = { 
        { "get_image_size", (PyCFunction)get_image_size, METH_O, nullptr },
        { "get_image_data", (PyCFunction)get_image_data, METH_O, nullptr },
        { "camera_lock", (PyCFunction)camera_lock, METH_O, nullptr },
        { "camera_unlock", (PyCFunction)camera_unlock, METH_O, nullptr },
        { nullptr, nullptr, 0, nullptr }
    };
    //    
    static PyModuleDef panoramamodule_module = {
        PyModuleDef_HEAD_INIT,
        "panoramamodule",
        "Provides panorama image data",
        0,
        panoramamodule_methods
    };
    //    ,        .pyd       
    PyMODINIT_FUNC PyInit_panoramamodule() {
        return PyModule_Create(&panoramamodule_module);
    }
    

    pythonコード
    
    #  panoramamodule,           ,      0
    from panoramamodule import *
    import numpy as np
    image_size =get_image_size(0)
    image_data =np.array(get_image_data(0))

    まとめ
    私はこれらが実行可能であることをテストして、データあるいは関数をpythonモジュールの下の関数に包装して、pythonコードの中で呼び出して取得することができます.何か問題があれば伝言を残してもいいです.