2017-05-09 5 views
1

私はPythonで書かれた関数を持っています。私はCython Documentation 'distutilsを使ってCythonモジュールを構築する'の手順に従っていました。しかし、Pythonで(インポートによって)C/C++に埋め込まれているモジュールを使用する方法は私には不明です。私はちょうどCythonを使用してPythonで生成されたモジュールをインポートするC/C++コードをコンパイルしたいと思っています(2ステッププロセスだと思います)。 pyxソースファイル。しかし、私の質問は、既存のC/C++ファイルにそのモジュールを統合する方法です。Cythonで生成されたモジュールをPythonからC/C++のメインファイルにインポートするには? (C/C++でのプログラミング)

答えて

0

Cython tutorialを見てから、これはCythonがどのように使用されるかです。コンパイル済みCモジュールを使用したPython。

  1. 個別のCythonモジュールはPythonで書かれています。 Cythonはこれを静的にコンパイルされたモジュールに変換します。
  2. setup.pyファイルを使用して、*.so共有ライブラリとしてCythonモジュールをコンパイルします。この共有ライブラリは実際にはPythonモジュールです。通常のPythonスクリプトimport一方、あなたがしたい場合はCでのPythonを拡張

    import helloworld

Cythonは通常に使用されているCythonモジュールから

python setup.py build_ext --inplace

  • embedあなたのCプログラムにはPythonコードもあります。 official docs on embedding Python into Cを見てみると、最初に読み上げるのに適しています。

    ここでは、それを行う方法を説明しているgithub projectとそれを行う方法についてはa blogです。

    # cymod.pyx 
    from datetime import datetime 
    
    cdef public void print_time(): 
        print(datetime.now().ctime()) 
    

    cymod.cからcymod.pyxをcythonizing、cymod.hが同様に生成されます。

  • +0

    私は上記のすべてのステップを実行しました。私の質問は、現在の既存のC/C++ファイルに、あなたのケースのhelloworldでそのモジュールを統合する方法です。私はその機能を使いたいです。しかし、コメントありがとう! –

    +0

    私はPythonをCに埋め込む方法についていくつかのリンクを追加しました。私はCythonの通常の使用はCでPythonを拡張することだと思っていますが、 – MrJLP

    2

    はちょうどあなたが例えばcdef public

    として、C/C++で呼び出したいものを宣言します。

    ライブラリを作成します(例:cymod.lib)。

    #include "Python.h" 
    #include "cymod.h" 
    
    
    int main(int argc, char **argv) 
    { 
    Py_Initialize(); 
    
    PyInit_cymod(); // in cymod.h 
    print_time(); // call the function from cython 
    
    Py_Finalize(); 
    return 0; 
    } 
    

    コンパイルして実行(MAIN.EXE)

    注: MAIN.EXEが高いPythonの環境にバインドされている一つよいCコード(main.cの)において

    cannot find pythonxx.dll,Fatal Python error: Py_Initialize: unable to load the file system codecなどのエラーが発生します。このサイトには多くのソリューションがあります。

    +0

    .libをどうやって作っていますか? –

    +1

    @Steven GコマンドラインでVSコンパイラを使用します。たとえば 'call vcvarsall amd64' ' cl/c/nologo cymod.c/Ipython-header-path' 'lib cymod.obj' – oz1