C/Python_PHP間の呼び出し関係チュートリアル
C/Python 間の呼び出し関係
Python には強力なオープンソース ライブラリが多数あるため、C はそれらのライブラリからメソッドを借用して、より多くの関数を完成させることができます。
そのため、CからPythonを呼び出す方法は特に重要です。
方法/手順
-
ubuntu 14.04 linux c
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Python 2.7.6
-
file 1 [python file]: math_test.py
def add_func(a,b):
return a+b
def sub_func(a,b):
return (a-b)
file 2 [c ソースファイル]: c_call_python。 c
#include
#include
#include
#include "python2.7/Python.h"
int main(int argc, char** argv)
{
int arg0 = 0,arg1 = 0;
if(argc == 3){
arg0 = atoi(argv[1]);
arg1 = atoi(argv[2]);
}else {
printf("引数を 2 つ入力してください!!n");
return -1;
}
Py_Initialize();
if ( !Py_IsInitialized())
return -1;
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
PyObject *pModule;
PyObject *pFunction;
PyObject *pArgs;
PyObject * pRetValue;
pModule = PyImport_ImportModule("math_test");
if(!pModule){
printf("import Python failed!!n");
return -1;
}
pFunction = PyObject_GetAttrString(pModule, "add_func");
if(!pFunction){
printf("get Python function failed!!!n");
return -1;
}
pArgs = PyTuple_New(2);
PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", arg0));
PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", arg1));
pretvalue = pyobject_callobject(pfunction、pargs); );
Py_DECREF(pArgs);
Py_DECREF(pRetValue);
Py_Finalize();
return 0;
}
root@linux:~/code# gcc -o c_call_python c_call_python.c -lpython2.7root@linux:~/code# ./c_call_python 12 15
312 + 15 = 27
3 Python モジュールをロードして関数を呼び出します~/test ディレクトリには test.py:
Py_BuildValue() 関数 (Python 拡張機能)
Py_BuildValue() 関数は、C 型のデータ構造を Python オブジェクトに変換します: PyObject *Py_BuildValue。 (char *format, ...) この関数は、PyArg_ParseTuple() 関数と同様に一連のフォーマット文字列を識別できますが、入力パラメーターは値のみであり、ポインターは使用できません。 Python オブジェクトを返します。 PyArg_ParseTuple() との違いは、PyArg_ParseTuple() 関数の最初のパラメーターがタプルであるのに対し、Py_BuildValue() は必ずしもタプルを生成しないことです。書式文字列に 2 つ以上の書式単位が含まれる場合にのみタプルを生成し、書式文字列が空の場合は NONE を返します。 次の説明では、括弧内の項目はフォーマット ユニットによって返される Python オブジェクトの型であり、角括弧内の項目は渡される C 値の型です。 "s" (string) [char *]: C 文字列を Python オブジェクトに変換します。C 文字列が空の場合は、NONE を返します。 "s#" (string) [char *, int]: C 文字列とその長さを Python オブジェクトに変換します。C 文字列が null ポインターの場合、長さは無視され、NONE が返されます。 "z" (文字列 orNone) [char *]: "s" と同じ。 "z#" (string orNone) [char *, int]: 機能は "s#" と同じです。 "i" (整数) [int]: C 型の int を Python int オブジェクトに変換します。 "b" (整数) [char]: "i" と同じ。 "h" (integer) [short int]: 機能は "i" と同じです。 "l" (integer) [long int]: Pyhon で C 型の long を int オブジェクトに変換します。 "c" (長さ 1 の文字列) [char]: C 型の char を長さ 1 の Python 文字列オブジェクトに変換します。 "d" (float) [double]: C 型の double を Python の浮動小数点オブジェクトに変換します。 "f" (float) [float] :機能は "d" と同じです。 "O&" (object) [converter,anything]: 変換関数を通じて任意のデータ型を Python オブジェクトに変換します。データは変換関数のパラメーターとして呼び出され、エラーが発生した場合は新しい Python オブジェクトが返されます。 , NULL が返されます。 "(items)" (tuple) [matching-items] : 一連の C 値を Python タプルに変換します。 "[items]" (list) [matching-items] : 一連の C 値を Python リストに変換します。 "{items}" (dictionary) [matching-items]: 一連の C 値を Python 辞書に変換します。連続する C 値の各ペアがキーと値のペアに変換されます。
例: Py_BuildValue("") なし Py_BuildValue("i", 123) 123 Py_BuildValue("iii", 123, 456, 789) (123, 456, 789) Py_BuildValue("s", "hello") ' こんにちは' Py_BuildValue("ss", "hello", "world") ('hello', 'world') Py_BuildValue("s#", "hello", 4) '地獄' Py_BuildValue("()" ) () Py_BuildValue("(i)", 123) (123,) Py_BuildValue("(ii)", 123, 456) (123, 456) Py_BuildValue("(i,i)", 123, 456) ( 123 , 456) Py_BuildValue("[i,i]", 123, 456) [123, 456] Py_BuildValue("{s:i,s:i}","abc", 123, "def", 456) { ' abc': 123, 'def': 456} Py_BuildValue("((ii)(ii)) (ii)",1, 2, 3, 4, 5, 6) (((1, 2), (3) 、4))、(5, 6))Pythonモジュールを呼び出すC++の詳細な分析
Python は、開発者が C++ プログラムから Python モジュールを簡単に呼び出せるようにする C++ ライブラリを提供します。次に、この記事を通じて、Python モジュールを呼び出す C++ の関連知識を紹介します。一般に、ゲームを開発したことがある人は、Lua と C++ をうまく組み合わせて学習できることを知っています。 、Lua スクリプトをダイナミック リンク ライブラリと同様に扱い、スクリプト開発の柔軟性をうまく活用します。人気の汎用スクリプト言語である Python でもそれが可能です。 C++ アプリケーションでは、プラグインのセットを使用して、統一されたインターフェイスを持ついくつかの機能を実装できます。通常、プラグインが頻繁に変更される場合は、プラグインの代わりに Python を使用できます。ダイナミック リンク ライブラリ形式。プラグイン (テキスト形式ではダイナミック リンク ライブラリと呼ぶこともできます) を使用すると、バイナリ ダイナミック リンク ライブラリを再コンパイルしてリンクする必要がなく、ニーズの変化に応じてスクリプト コードを簡単に書き直すことができます。柔軟性が大幅に向上します。 Python はグルー言語として、C、C++、その他の言語を簡単に呼び出すことができ、また、他の言語を通じて Python モジュールを呼び出すこともできます。 Python は C++ ライブラリを提供しており、開発者は C++ プログラムから Python モジュールを簡単に呼び出すことができます。 特定のドキュメントについては、公式ガイドを参照してください: 別のアプリケーションへの Python の埋め込みメソッドの呼び出し1 Python 呼び出しライブラリへのリンク Python インストール ディレクトリには、ヘッダー ファイル (インクルード ディレクトリ) とライブラリ ファイル (python27) がすでに含まれていますWindows の場合) .lib)。 このライブラリを使用する前に、このライブラリにリンクする必要があります。 2 Python ステートメントを直接呼び出します<code class="cpp hljs ">#include "python/Python.h"int main(){Py_Initialize(); ## 初始化PyRun_SimpleString("print 'hello'");Py_Finalize(); ## 释放资源}</code>
ログイン後にコピーが含まれています次のコードを通じて test_add 関数を呼び出すことができます:<code class="python hljs ">def test_add(a, b):print 'add ', a, ' and ', breturn a+b</code>
ログイン後にコピーパラメータの受け渡し1 C++ Python にパラメータを渡すPython パラメータは実際にはタプルなので、パラメータを渡すことは実際には適切なタプルを構築することになります。 一般的に使用されるメソッドは 2 つあります: PyTuple_New を使用してタプルを作成し、PyTuple_SetItem を使用してタプル値を設定します<code class="cpp hljs ">#include "python/Python.h"#include <iostream>using namespace std;int main(){Py_Initialize(); // 初始化// 将Python工作路径切换到待调用模块所在目录,一定要保证路径名的正确性string path = "~/test";string chdir_cmd = string("sys.path.append(\"") + path + "\")";const char* cstr_cmd = chdir_cmd.c_str();PyRun_SimpleString("import sys");PyRun_SimpleString(cstr_cmd);// 加载模块PyObject* moduleName = PyString_FromString("test"); //模块名,不是文件名PyObject* pModule = PyImport_Import(moduleName);if (!pModule) // 加载模块失败{cout << "[ERROR] Python get module failed." << endl;return 0;}cout << "[INFO] Python get module succeed." << endl;// 加载函数PyObject* pv = PyObject_GetAttrString(pModule, "test_add");if (!pv || !PyCallable_Check(pv)) // 验证是否加载成功{cout << "[ERROR] Can't find funftion (test_add)" << endl;return 0;}cout << "[INFO] Get function (test_add) succeed." << endl;// 设置参数PyObject* args = PyTuple_New(2); // 2个参数PyObject* arg1 = PyInt_FromLong(4); // 参数一设为4PyObject* arg2 = PyInt_FromLong(3); // 参数二设为3PyTuple_SetItem(args, 0, arg1);PyTuple_SetItem(args, 1, arg2);// 调用函数PyObject* pRet = PyObject_CallObject(pv, args);// 获取参数if (pRet) // 验证是否调用成功{long result = PyInt_AsLong(pRet);cout << "result:" << result;}Py_Finalize(); ## 释放资源return 0;}</iostream></code>
ログイン後にコピーPy_BuildValue を直接使用してタプルを構築します<code class="cpp hljs ">PyObject* args = PyTuple_New(3);PyObject* arg1 = Py_BuildValue("i", 100); // 整数参数PyObject* arg2 = Py_BuildValue("f", 3.14); // 浮点数参数PyObject* arg3 = Py_BuildValue("s", "hello"); // 字符串参数PyTuple_SetItem(args, 0, arg1);PyTuple_SetItem(args, 1, arg2);PyTuple_SetItem(args, 2, arg3);</code>
ログイン後にコピーi、s、f などの書式文字列の場合は、フォーマット文字列を参照できます2 Python の戻り値を変換する Python を呼び出したときに取得するものは PyObject オブジェクトであるため、戻り値を C++ に変換するには、Python が提供するライブラリ内の関数 (PyInt_AsLong など) を使用する必要があります。 PyFloat_AsDouble、PyString_AsString などPyArg_ParseTuple 関数を使用して、戻り値をタプルとして解析することもできます。 PyArg_Parse も非常に便利な変換関数です。 PyArg_ParseTuple と PyArg_Parse は両方ともフォーマット文字列を使用します注意事項モジュールのロードまたは関数のロードでは、ファイル名ではなくモジュール名に従って Python 作業ディレクトリを切り替える必要があります。成功したかどうかを確認します。そうでない場合は、スタックが発生する可能性があります。エラーによりプログラムがクラッシュします。オブジェクトを逆参照するには、Py_DECREF(PyObject*) を使用する必要があります (Python ガベージ コレクション用)。<code class="cpp hljs ">PyObject* args = Py_BuildValue("ifs", 100, 3.14, "hello");PyObject* args = Py_BuildValue("()"); // 无参函数</code>
ログイン後にコピー

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









ここ数日、Ice Universeは、サムスンの次期主力スマートフォンであると広く信じられているGalaxy S25 Ultraの詳細を着実に明らかにしている。とりわけ、リーカーはサムスンがカメラのアップグレードを1つだけ計画していると主張した

OnLeaks は、X (旧 Twitter) のフォロワーから 4,000 ドル以上を集めようとして失敗した数日後、Android Headlines と提携して Galaxy S25 Ultra のファーストルックを提供しました。コンテキストとして、h の下に埋め込まれたレンダリング イメージ

TCLは、2つの新しいスマートフォンの発表に加えて、NXTPAPER 14と呼ばれる新しいAndroidタブレットも発表しました。その巨大な画面サイズはセールスポイントの1つです。 NXTPAPER 14 は、TCL の代表的なブランドであるマット LCD パネルのバージョン 3.0 を搭載しています。

ここ数日、Ice Universeは、サムスンの次期主力スマートフォンであると広く信じられているGalaxy S25 Ultraの詳細を着実に明らかにしている。とりわけ、リーカーはサムスンがカメラのアップグレードを1つだけ計画していると主張した

Vivo Y300 Pro は完全に公開されたばかりで、大容量バッテリーを備えた最もスリムなミッドレンジ Android スマートフォンの 1 つです。正確に言うと、このスマートフォンの厚さはわずか 7.69 mm ですが、6,500 mAh のバッテリーを搭載しています。これは最近発売されたものと同じ容量です

サムスンは、ファンエディション(FE)スマートフォンシリーズをいつアップデートするかについて、まだ何のヒントも提供していない。現時点では、Galaxy S23 FE は 2023 年 10 月初めに発表された同社の最新版のままです。

Redmi Note 14 Pro Plusは、昨年のRedmi Note 13 Pro Plus(Amazonで現在375ドル)の直接の後継者として正式に発表されました。予想通り、Redmi Note 14 Pro Plusは、Redmi Note 14およびRedmi Note 14 Proと並んでRedmi Note 14シリーズをリードします。李

Motorola は今年数え切れないほどのデバイスをリリースしましたが、そのうち折りたたみ式デバイスは 2 つだけです。ちなみに、世界の大部分ではこのペアが Razr 50 および Razr 50 Ultra として受け入れられていますが、Motorola は北米では Razr 2024 および Razr 2 として提供しています。
