C++がpythonを呼び出す
http:// blog.csdn.net/pipisorry/article/details/49532341
<スパン C++からpythonへの呼び出し
C/C++にPythonを埋め込むと、Pythonが提供するパワーを利用することができます。Pythonを埋め込むことで、ダイナミックリンクライブラリの形でインターフェースを置き換えることができ、バイナリのダイナミックリンクライブラリを再コンパイル、リンクすることなく、必要に応じてスクリプトコードを簡単に変更することができます。少なくとも、テキストベースのDLLとして扱うことができ、インターフェイスを変更しない限り、必要であれば変更することができます。C++のプログラムがコンパイルされると、それはそれほど簡単なことではありません。
<スパン C++でPythonを呼び出すには、次の2つの方法があります。
最初の方法:呼び出すPythonモジュール、クラス、メソッド、およびコンストラクタのパラメータを見つけることによって。
2つ目の方法は、Pythonスクリプトを作成し、Pythonエンジンで実行する方法です。
最初の方法は、おそらくよりエレガントで、ほとんどのリフレクションコールに適合します。(例:C#のリフレクション機構、Com+へのC#の呼び出し、javascriptスクリプトへのC#の呼び出しなど)。
問題:2つの言語が互いに呼び合うとき、メモリ上のオブジェクトを共有するためにデータ構造(基本型、文字列、整数型など、およびカスタムクラスなどの型)間で変換を行う必要がある。例えば、C++のオブジェクトインスタンスをpythonに渡して、pythonで使う方法。c++とpythonは同じプロセスではないので、boostのshared_ptrを使って実現します。understand"型。同じことが、C++ が Python スクリプトを呼び出す方法についても言えます。
次の例は、C++でpythonスクリプトを作成し、PyRun_SimpleStringで呼び出すことで、C++がpythonを呼び出すことを示します。また、C++オブジェクトを作成してpythonに渡し、pythonスクリプトでその関数を呼び出すことで、C++がpythonを呼び出すことを示します。
<スパン VSでコンパイルして実行する
vs インストールの設定
python 3.4 をインストールし、システム環境変数を設定します。
Visual Studio 2010をインストールします(他の多くのものをインストールせずに、c++だけでできることに注意してください)。[ Visual Studio関連の設定 ]
を新規に作成します。
win32 コンソールアプリケーション
は、すべてOKで終了してください。
<スパン VS2010の設定(コンパイル環境の構築)
1. c++ から python を呼び出すには、vs2010 の cpp ファイルに <Python.h> を追加する必要があります。ヘッダーファイルは python のインストールディレクトリの Pythoninclude の下にあります。
うまく導入するためには
Python.h header file directory (e.g. D:\python3.4.2include in menu > Projects > Properties > C/C++ > General > Additional Includes directory)です。
(またはプロジェクトを右クリック)
2. また、python34.libが必要で、これをインポートしないとファイルが見つからないと表示されます。このファイルはpythonlibsの下にあります。このファイルを見つけて、VS2010のメニュー> Project > Properties > Configure properties > VC++ directory > Library directory, put the absolute path that you just used (e.g. D:\python3.4.2libs). 追加すると、次のようになります。D:\python3.4.2libs;$(VCInstallDir)lib;$(VCInstallDir)atlmfclib;$(WindowsSdkDir)lib;$(FrameworkSDKDir)\lib.C:³³³³³³³³³³ となります。これにより、VCプログラム内でpythonファイルを実行することができるようになります。
または、D: \python3.4.2libs を
プロジェクト > プロパティ > 設定プロパティ > リンカ > 全般 > 追加ライブラリ・ディレクトリ
の中にある。
備考
上記の設定はある特定のモードで有効です。実行モードをデバッグからリリースに変更した場合、もう一度設定し直さないと動作しません。
<スパン プログラムエディタ
<スパン
c++コードの編集
PythonInvoke.cpp ファイルを以下のコードに変更し、Python プログラム helloworld を呼び出すようにします。
// PythonInvoke.cpp : コンソールアプリケーションのエントリーポイントを定義しています。
#include "stdafx.h"
#include<Python.h>
void main(){
<未定義
Py_Initialize(); /* Python インタープリタを初期化し、どの Python コンパイラを使用するかをコンパイラに伝える */ -------------------------------------------------------------------------------- /* Python インタープリタを初期化し、どの Python コンパイラを使用するかをコンパイラに伝える。
PyRun_SimpleString("import helloworld"); /* pythonファイルの呼び出し */
PyRun_SimpleString("helloworld.printHello()"); /* Pythonファイル内の関数を呼び出す*/
Py_Finalize(); /*Pythonインタプリタを終了し、リソースを解放する*/。
system("pause")を実行します。
}
備考
: PyImport_ImportModule 関数は、Python コードにエラーがある場合に NULL を返します。
もう一つの呼び出しのコード
#include<Python.h>// 以前に行ったすべての作業は、このヘッダーファイルと関連するライブラリを呼び出すように構成されています。
#include<iostream>
名前空間std.を使用する
int main(){
<未定義
Py_Initialize();// Pythonを使う前に初期化するためにこの関数を呼び出します。
PyObject * pModule = NULL;//変数の宣言
PyObject * pFunc = NULL;// 変数の宣言
pModule = PyImport_ImportModule("helloworld");// 以下、呼び出すファイル名です。
pFunc= PyObject_GetAttrString(pModule, "Hello");// これが呼び出される関数の名前です。
PyEval_CallObject(pFunc, NULL);// 関数を呼び出します。
Py_Finalize();//ルートPy_Initializeの対応するPy_Finalizeを呼び出す。
は0を返します。
}
<スパン Pythonのコードを編集する
プロジェクトのソースファイルにあるhelloworld.pyにfileコマンドを追加します。
def printHello():
print("ハローワールド!")
.py ファイルは、.cpp と同じディレクトリに保存されます。
注意事項
: なぜなら test.py は組み込みの python スクリプトファイルであり、python は独自の test.py ファイルを持っていて、その優先順位はあなたのより高いからです。
<スパン プログラムの実行
Python のインストールが 64 ビットである場合、vs2010 のソリューションプラットフォームを「X64」モードで配置する必要があり、そうしないと構成が機能しません。
エラーの報告
fatal error LNK1112: Module computer type 'X86' conflicts with target computer type 'x64'. また、[
致命的なエラー LNK1112
]
<スパン リリースモードでの実行
あまり多くのことを設定せずに、リリースモードで実行する
実行オプションの変更
デバッグからリリースへ
Win32のドロップダウン設定、新規x64、全てOKにする
なお、以下を実行する前に、VS2010の設定をリリースモードで再度セットアップする必要があります。
実行
実行成功!
<スパン デバッグモードで実行する
1. Debug では、python/libs ディレクトリにある python34.lib をコピーして python34_d.lib という形式にリネームする必要があります。
設定します。
プロジェクト > プロパティ > 設定プロパティ > リンカ > 入力 > 追加依存ライブラリ > python34_d.lib
.
[ python26_d.lib を生成するために python をソースコンパイルする; エラー c101008d を処理する ]
python34.lib と python34_d.lib に違いがあるのは、 :python_d.lib はライブラリのポストデバッグフォームであり、デバッグモードでプロジェクトをコンパイルすると python はこの lib ファイルを使用しますが、このファイルが使用できないからです。これに対処する最も早い方法は、python がすべてのケースで非デバッグバージョンを使用するように強制することであり、あなたは大丈夫です。
つまり、python のヘッダーファイル python/include/pyconfig.h を変更することで、リネームせずに解決します。
# if defined(_DEBUG)
# pragma comment(lib,"python34_d.lib")
# elif defined(Py_LIMITED_API)
# pragma comment(lib,"python3.lib")
# else
# pragma comment(lib,"python34.lib")
# endif /* _DEBUG */
DEBUG条件のlibをpython34_d.libからpython34.libに変更します。
# if defined(_DEBUG)
# pragma comment(lib,"python34.lib")
2. 64ビットデバッグでの解決策
プロジェクト名を右クリックし、プロパティをクリックし、プロジェクトのプロパティページをポップアップし、linker-advancedを見つけ、右側のターゲットコンピュータを修正し、x64のオプションがあるものを選択します。ない場合は、コンパイラ構成マネージャで新規を選択し、amd64などのプラットフォームを追加し、プロジェクトのプロパティでx64を選択します。
このステップも必要ないようで、実行時にx64を選択すればよいようです。3.実行を参照してください。
注)プロパティ-リンカー-コマンドライン-追加オプション。そこに "/MACHINE:I386" のようなものがあれば、それを削除してください。
<スパン 3. 32ビットライブラリから64ビットライブラリへ
プロジェクト > プロパティ > 構成プロパティ > Vc++ ディレクトリ > ライブラリディレクトリ ここで32ビットライブラリを64ビットライブラリに変更することは非常に重要です。
$(VCInstallDir)lib\amd64
$(VCInstallDir)atlmfc\lib\amd64
$(WindowsSdkDir)lib\x64
例)put D:\python3.4.2libs;$(VCInstallDir)atlmfclib;$(WindowsSdkDir)lib;$(FrameworkSDKDir)\lib
Replace with D:\python3.4.2libs;$(VCInstallDir)libamd64;$(VCInstallDir)atlmfclibamd64;$(WindowsSdkDir)libx64;$(FrameworkSDKDir)\lib
この設定をしないと、次のエラーが報告されます。 msvcprtd.lib(MSVCP100D.dll) : fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'x64'
msvcprtd.lib(MSVCP100D.dll) : fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'x64'.
[ msvcprtd.lib(MSVCP100D.dll) : 致命的エラー LNK1112: モジュールのマシンタイプ 'X86' がターゲットのマシンタイプ 'x64' と競合しています。 ]
また、cmakeでも同様の問題があります[ ]。
fatal error LNK1112: Module computer type "X86" conflicts with target computer type "x64" - my solution
。]
3. 走る。 プロジェクト名を右クリックし、Clean Solutionを選択し、クリーニング後にソリューションを再生成し、X64プラットフォームのコンパイラを選択してデバッグを行い、正常にデバッグが完了しました。
<スパン
想定されるエラー
c++はエラーでpythonを呼び出す LINK : fatal error LNK1123: COFFへの変換中に失敗しました:ファイルが無効か壊れています。
This is caused by log file, you can change the project \properties, property list tool﹑input and output﹑embedded list: it was "yes", change it to "no"﹑Log file.
または、 \projectspropertiesconfiguration paragraph paragraph linker list file generate list: it was "yes", change it to "no".
それでもうまくいかない場合は、VS2012がすでにインストールされているかどうかを判断し、インストールされている場合は、VS2010のsp1パッチをインストールする必要があります。
しかし、もしプログラムがwrite rcを追加するものであるなら、正しく動作するためにリストが付属していなければなりません。だから、この治療法はうまくいかない。
もう一つの解決策があります。
この問題の原因:おそらく最近何度かシステムが更新されたため、cvtres.exeのバージョンが2つ存在するのでしょう。そして、システム変数がその両方を参照しているため、コンパイル時にどちらを使用すればよいか分からず、エラーになります。そこで、片方を削除します。
1つはC:⇄WindowsMicrosoft.NETの中にある。 4.0.30319\ cvtres.exe、もう一つはVSをインストールしたソフトウェアディレクトリにある... \╱Microsoft Visual Studio 10.0 vcvtres.exe
そして、右クリックのプロパティ -> 詳細 両方のバージョン番号を確認し、古い方を削除して完了です。
[ LINK : fatal error LNK1123 に対する完全な解決策。COFFへの変換中に失敗しました:ファイルが無効か破損しています ]
コンパイル時の_RTC_Shutdownと_RTC_InitBaseに関連するエラーのワークアラウンド。
error LNK2001: Unresolvable external symbol _RTC_Shutdown;error LNK2001: Unresolvable external symbol _RTC_InitBase
プロジェクトを右クリックし、変更します。プロパティ > 構成プロパティ > C/C++ > コード生成 > 基本ランタイムチェック の値を "Both (......)" から "default" に変更します。
[
コンパイル時の_RTC_Shutdownと_RTC_InitBaseに関連するエラーのワークアラウンド
]
LINK : error LNK2001: Unresolved external symbol mainCRTStartup
その他のエラー
error LNK2019: Unresolved external symbol __imp_system, which is referenced in function main
原因は、system("pause");が含まれていないためです。
[ 問題なく設定・コンパイルされたpythonへのC++コール ]
<スパン コマンドラインから直接呼び出して実行する
コンパイルオプションでは、Pythonのインクルードパスとリンクパスを手動で指定する必要があります。
<スパン パラメータ渡しによるC++からpythonへの呼び出し
Pythonの関数を呼び出すとき、C++の型である引数渡しは、どのようにPythonに変換するか。もう一つの問題は、Python関数の戻り値は、どのようにC++の型に変換するかということです。
PythonスクリプトでC言語のプログラムに引数を渡したり、Pythonスクリプトの戻り値を取得したりするには、C言語のプログラムを書くための関数を多く使うことになります。Pythonは独自のデータ型を持っているので、Cプログラムで対応するデータ型を操作するには、特別なAPIを使う必要があります。
<スパン よく使われる関数は以下の通りです。
1. 数値・文字列処理
Python/CのAPIでは、数値や文字列をPythonの対応するデータ型に変換するPy_BuildValue()という関数が提供されています。この関数のプロトタイプを以下に示します。
PyObject* Py_BuildValue( const char *format, ...)
そのパラメータの意味は以下の通りです。
- 形式を指定します。表 8-1 に示すようなフォーマットされた文字列。
Py_BuildValue()関数の残りの引数は、変換するC言語の整数、浮動小数点、文字列などです。その戻り値は、PyObject型へのポインタです。C言語では、すべてのPython型はPyObject型として宣言されます。
2. リスト操作
Python/CのAPIでは、新しいPythonのリストを作成するためのPyList_New()関数が提供されており、PyList_New()関数は作成したリストの値を返します。関数のプロトタイプは以下のとおりです。
PyObject* PyList_New( Py_ssize_t len)
そのパラメータの意味は以下の通りです。
- len: 作成されるリストの長さ。
リストが作成されたら、PyList_SetItem()関数を使用してリストに項目を追加することができます。この関数のプロトタイプを以下に示します。
int PyList_SetItem( PyObject *list、Py_ssize_t index、PyObject *item)
そのパラメータの意味は以下の通りです。
- list: 追加するアイテムのリスト。
- index: 追加するアイテムの位置のインデックス。
- item: 追加された項目の値。
Python/C API の PyList_GetItem() 関数を使用して、リスト内のアイテムの値を取得することも可能です。その関数プロトタイプを以下に示します。
PyObject* PyList_GetItem( PyObject *list、Py_ssize_t インデックス)
パラメータの意味は以下の通りです。
- list: 実行される操作のリスト。
- index: 項目の位置のインデックス。
Pythonにおけるリスト操作に相当する関数は、Python/C APIで提供される。例えば、リストのappendメソッドはPyList_Append()関数に対応する。リストのソートメソッドは、PyList_Sort()関数に対応します。リストのreverseメソッドは、PyList_Reverse()関数に対応します。それぞれの関数のプロトタイプを以下に示します。
int PyList_Append( PyObject *list, PyObject *item)
int PyList_Sort( PyObject *list)
int PyList_Reverse( PyObject *list)
PyList_Append()関数の場合、引数の意味は以下の通りです。
- list: 操作されるリスト。
- item: 参加するアイテム。
PyList_Sort()とPyList_Reverse()関数では、引数は同じ意味を持ちます。
- list: 操作されるリスト。
3. タプル演算
Pythonのタプルを新規に作成するために、Python/C APIでPyTuple_New()関数が提供されています。この関数のプロトタイプを以下に示します。
PyObject* PyTuple_New( Py_ssize_t len)
そのパラメータの意味は以下の通りです。
- len: 作成されるタプルの長さ。
タプルが作成されたら、PyTuple_SetItem()関数を使用してタプルに項目を追加できます。この関数のプロトタイプは以下のとおりです。
int PyTuple_SetItem( PyObject *p, Py_ssize_t pos, PyObject *o)
そのパラメータの意味は以下の通りです。
- p: 実行された操作のタプル。
- pos: 追加されたアイテムの位置のインデックス。
- o: 追加された項目の値です。
Python/C API の PyTuple_GetItem() 関数を使用すると、タプル内のアイテムの値を取得できます。PyTuple_GetItem() 関数はアイテムの値を返します。その関数プロトタイプを以下に示します。
PyObject* PyTuple_GetItem( PyObject *p, Py_ssize_t pos)
そのパラメータの意味は以下の通りです。
- p: 操作されるタプル。
- pos: 項目の位置インデックス。
_PyTuple_Resize()関数は、作成後のタプルのサイズを変更するために使用することができます。この関数のプロトタイプを以下に示します。
int _PyTuple_Resize( PyObject **p, Py_ssize_t newsize)
そのパラメータの意味は以下の通りです。
- p: 操作対象となるタプルへのポインタ。
- newsize: 新しいタプルのサイズ。
4. 辞書操作
Python/CのAPIでは、新しい辞書を作成するためのPyDict_New()関数が提供されています。この関数のプロトタイプを以下に示します。
PyObject* PyDict_New()
辞書が作成されたら、PyDict_SetItem()関数とPyDict_SetItemString()関数を使用して辞書に項目を追加することができます。これらの関数のプロトタイプは、それぞれ以下のとおりです。
int PyDict_SetItem( PyObject *p, PyObject *key, PyObject *val)
int PyDict_SetItemString( PyObject *p, const char *key, PyObject *val)
そのパラメータの意味は以下の通りである。
- p: 操作対象となる辞書。
- key: 追加する項目のキーワード、PyDict_SetItem()関数の場合はPyObject、PyDict_SetItemString()関数の場合はcharです。
- val: 追加された項目の値。
辞書内の項目の値を取得するには、Python/C API の PyDict_GetItem() 関数と PyDict_GetItemString() 関数を使用します。これらは両方とも項目の値を返します。それぞれの関数のプロトタイプは以下のとおりです。
PyObject* PyDict_GetItem( PyObject *p, PyObject *key)
PyObject* PyDict_GetItemString( PyObject *p, const char *key)
そのパラメータの意味は以下の通りである。
- p: 操作対象となる辞書。
- key: 追加された項目のキーワード、PyDict_GetItem()関数の場合はPyObject、PyDict_GetItemString()関数の場合はcharです。
辞書から項目を削除するには、Python/C API の PyDict_DelItem() 関数と PyDict_DelItemString() 関数を使用します。関数のプロトタイプは以下のとおりです。
int PyDict_DelItem( PyObject *p, PyObject *key)
int PyDict_DelItemString( PyObject *p, char *key)
そのパラメータの意味は以下の通りである。
- p: 操作対象となる辞書。
- key: 追加した項目のキーワード、PyDict_DelItem()関数の場合はPyObject、PyDict_DelItemString()関数の場合はcharを指定します。
Python/C API の PyDict_Next() 関数を使用して、辞書を走査することができます。この関数のプロトタイプは以下のとおりです。
int PyDict_Next( PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
そのパラメータの意味は以下の通りである。
- p: 探索される辞書。
- ppos: 辞書内の項目の位置で、0に初期化されている必要があります。
- pkey: 辞書のキーワードを返す。
- pvalue: 辞書の値を返します。
Pythonにおける辞書操作に相当する関数は、Python/C APIで提供される。例えば、辞書のitemメソッドは、PyDict_Items()関数に対応します。辞書のkeysメソッドは、PyDict_Keys()関数に対応します。辞書のvaluesメソッドは、PyDict_Values()関数に対応します。関数のプロトタイプはそれぞれ以下のとおりです。
PyObject* PyDict_Items( PyObject *p)
PyObject* PyDict_Keys( PyObject *p)
PyObject* PyDict_Values( PyObject *p)
そのパラメータの意味は以下の通りである。
- p: 操作対象となる辞書。
5. リソースの公開
Pythonは参照カウントの仕組みを使ってメモリを管理し、自動ガベージコレクションを実装しています。C/C++でPythonオブジェクトを使用する場合、参照カウントは正しく処理されるべきで、そうでなければ簡単にメモリリークにつながる可能性があります。Py_CLEAR() や Py_DECREF() などのマクロが Python/C API で提供されており、参照カウントを操作することができます。
Python/C API の関数を使用してリスト、タプル、辞書などを作成すると、これらのオブジェクトの参照カウントがメモリ上に生成される。これらのオブジェクトは、Py_CLEAR() や Py_DECREF() などのマクロを使用して操作された後、破棄する必要があります。それらのプロトタイプは、それぞれ以下のようになります。
void Py_CLEAR( PyObject *o)
void Py_DECREF( PyObject *o)
そのパラメータの意味は以下の通りである。
- o: 操作対象となるオブジェクト。
Py_CLEAR()の引数はNULLポインタで、この場合Py_CLEAR()は何の処理も行いません。そして Py_DECREF() の引数は NULL ポインタであってはならず、そうでない場合はエラーになります。
6. モジュールと機能
Python/C API の PyImport_Import() 関数を使用すると、Python モジュールを C プログラムにインポートすることができま す。その関数のプロトタイプを以下に示します。
PyObject* PyImport_Import( PyObject *name)
そのパラメータの意味は以下の通りです。
- name: インポートするモジュールの名前。
Pythonの関数は、Python/C APIにあるPyObject_CallObject()関数とPyObject_CallFunction()関数を使ってCプログラムで呼び出すことができます。それぞれのパラメータプロトタイプは以下のとおりです。
PyObject* PyObject_CallObject( PyObject *callable_object, PyObject *args)
PyObject* PyObject_CallFunction( PyObject *callable、char *format、...)
PyObject_CallObject()関数の場合、引数の意味は以下の通りです。
- callable_object: 呼び出される関数のオブジェクト。
- args: タプル形式の引数のリスト。
PyObject_CallFunction()関数の場合、引数の意味は以下の通りです。
- callable_object: 呼び出される関数のオブジェクト。
- format: 引数の型を指定します。
- ... : 関数に渡す引数。
Pythonモジュール内の関数の一覧を取得するには、Python/C API の PyModule_GetDict() 関数を使用します。PyModule_GetDict() 関数は辞書を返します。辞書のキーワードは関数名で、値は関数呼び出しのアドレスです。関数のプロトタイプは以下のとおりです。
PyObject* PyModule_GetDict( PyObject *module)
そのパラメータの意味は以下の通りです。
- module: インポートされたモジュール・オブジェクト。
8.2.3 C言語でのPythonインスタンスの埋め込みVC++6.0で"EmbPython"という名前の空のプロジェクトを新規に作成します。以下のように、"EmbPython.c"というファイルを追加します。
プログラムの出力は以下のようになります。
-==C言語へのPythonの組み込み
Pythonのsum関数を使って、次の数値の和を求めなさい。
0 1 2 3 4
関数sumの使用
その結果は 10
Pythonの関数を使って、次の文字列を分割してください。
これは例です
結果は以下のようになります。
これ
は
アン
例
エンターキーを押して、プログラムを終了します
[
C/C++に埋め込まれたPython (Pythonコアプログラミング)
]
C++からPythonへの型変換、Py_BuildValue()
http://www.python.org/doc/1.5.2p2/ext/buildValue.html
- PyObject* pArgs=PyTuple_New() 1 ); //いくつかの引数で、です。
- PyTuple_SetItem(pArgs, 0 ,Py_BuildValue()。 を使用します。 , 3 )); //最初の第一引数のデータ型 i は int であり、その値は 3
<スパン pythonがc++を呼び出す問題
"pythonからC++への引数がない場合は正常ですが、引数がある場合はエラーでダメになります"。実装してみたところ、答えが見つかりました。
http://stackoverflow.com/questions/145270/calling-c-c-from-python
1. 引数なし 関数宣言 C 使用可能な関数
2. 引数付き 次に、ユーティリティSWIG、つまり、インターフェイスファイルが必要です。
z.iファイル
%{
#include "z.h"
外部関数名(パラメータ1、パラメータ2、・・・) ;
%}
SWIGは、異なる言語を相互に呼び出すために非常に重要な役割を果たします。
<スパン 関連トピック
スウィッグ
SWIGという外部ツールがあります。Simplified Wrapper and Interface Generatorの頭文字をとったものです。これは、Python Essential Referencという本の著者であるDavid Beazleyによって書かれたものです。このツールは、特別にコメントされたC/C++ヘッダーから、Python、Tcl、Perlのラッパーコードを生成します。SWIGを使用することで、先に説明したサンプルコードを書く時間を短縮することができます。あなたは、C/C++で実際の問題を解決することだけに気を取られていればよいのです。SWIG形式でファイルを書くだけで、あとはSWIGがやってくれるのです。SWIGの詳細については、以下のURLを参照してください。
http://swig.org
パイレックス
C/C++の拡張機能を作ることの明らかな欠点の1つは、C/C++のコードを書かなければならないことです。その長所を生かすことができますが、もっと重要なのは、その短所にもぶつかるということです。Pyrexを使えば、拡張機能の長所だけを取り出して、まったく心配することなく利用できます。C言語とPython言語のハイブリッドで、よりPythonに特化したものとなっている。実際、Pyrexの公式サイトには、"Pyrex is Python with C data types"と書かれています。Pyrexの構文でコードを書き、Pyrexコンパイラを実行してソースコードをコンパイルするだけで、Pyrexは対応するCコードを生成し、一般的な拡張機能にコンパイルすることができます。Pyrexは、以下の公式ウェブサイトからダウンロードできます。
http://cosc.canterbury.ac.nz/~greg/python/Pyrex
サイコ
Pyrexは、純粋なCコードを再び書く手間を省いてくれます。しかし、その独特の構文を学ぶ必要があります。最終的に、あなたのPyrexコードはCコードに変換されることに変わりはありません。C/C++、C/C+++SWIG、Pyrexのいずれを使うにしても、それはプログラムを高速化したいからです。Pythonのコードを変えずに、スピードアップが図れればいいのですが。
サイコの思想は、他のアプローチとは大きく異なります。Cのコードに変更する代わりに、既存のPythonのコードに
Psycoは、バイトコードを実行時に自動的にネイティブコードに変換するJIT(ジャストインタイム)コンパイラです。そのため
Psycoモジュールを(実行時に)インポートして、コードの最適化を開始するように指示すればいいのです。自分の世代を修正する代わりに
Psycoは、コードの様々な部分の実行時間をチェックして、ボトルネックを見つけることもできます。また、ログ機能をオンにすることで
コードの最適化に関して、Psycoがどのようなことをしているかをご覧ください。詳しくは、以下のサイトをご覧ください。
http://psyco.sf.net
エンベデッド
Pythonのもう一つの特徴として、エンベッディングがあります。Pythonの拡張にCのコードをラップするのとは対照的に、エンベッディングはCのプログラムにPythonのインタプリタをラップするものです。これにより、大規模な、単一の、要求の厳しい、プライベートな、そして/または重要なアプリケーションに、Pythonインタプリタを埋め込む機能を提供します。ひとたびPythonが組み込まれると、世界はまったく別の場所になります。
Pythonは拡張機能を書く人のために、多くの公式ドキュメントを提供しています。
拡張機能とエンベッディング
http://docs.python.org/ext
Python/C API
http://docs.python.org/api
Pythonモジュールの配布
http://docs.python.org/dist
[Pythonコアプログラミング2e.d. - Extending Python].
からです。
http://blog.csdn.net/pipisorry/article/details/49532341
ref:python doc: Python/C API リファレンスマニュアル
python doc: エンベッディング Pythonを他のアプリケーションに組み込む
[ Pythonと通信するためにC/C++を実装するにはどうしたらいいですか? ]*
[ Googleは、C++やPythonとの対話を容易にするためのフレームワークを開発しました C++プログラムのインターフェイスラッパーをPythonで生成できるようになりました。
関連
-
C/C++共通エラーの概要
-
エラー: "***"の前にイニシャライザーがあります。
-
gcc/g++ コンパイル時のエラー解析で期待される型指定子の前に
-
非静的メンバ関数の無効な使用
-
警告を表示します。ISO C++は文字列定数を'char*'に変換することを禁じています[-Write-strings]。
-
c++のエラー: エラーC2601: 'main' : ローカル関数定義が不正
-
C++ Error no matching function for call to 'std::basic_ofstream<char>::basic_ofstream(std::string&)
-
EclipseのC++コードでシンボル'std'が解決できない問題の解決
-
ランタイムエラー: 'std::logic_error' のインスタンスを投げた後に terminate が呼び出されました。
-
デバッグエラー Assertion Failed 問題について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
C++コンパイルエラー:||error: ld returned 1 exit status|.
-
C++プリントベクター
-
const char*' から `char*' への変換が無効な場合の対処法
-
c++ experience summary(1):linux c compile with warning: assign makes pointer from integer without cast reason.
-
C++プロジェクトのコンパイル時に再定義の多重定義問題を解決する
-
C++11 ランダムライブラリ乱数
-
C++共通ライブラリ関数一覧
-
C++によるhttpサーバー/webサーバーの作成
-
[エラー]'cout' はこのスコープで宣言されていません。
-
std::allocator<char>::~allocator()' への未定義の参照