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="language-cpp hljs ">#include "python/Python.h"int main(){Py_Initialize(); ## 初始化PyRun_SimpleString("print 'hello'");Py_Finalize(); ## 释放资源}</code>
<code class="language-python hljs ">def test_add(a, b):print 'add ', a, ' and ', breturn a+b</code>
が含まれています次のコードを通じて test_add 関数を呼び出すことができます:<code class="language-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>
パラメータの受け渡し1 C++ Python にパラメータを渡すPython パラメータは実際にはタプルなので、パラメータを渡すことは実際には適切なタプルを構築することになります。 一般的に使用されるメソッドは 2 つあります: PyTuple_New を使用してタプルを作成し、PyTuple_SetItem を使用してタプル値を設定します<code class="language-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>
Py_BuildValue を直接使用してタプルを構築します<code class="language-cpp hljs ">PyObject* args = Py_BuildValue("ifs", 100, 3.14, "hello");PyObject* args = Py_BuildValue("()"); // 无参函数</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 ガベージ コレクション用)。

PHPは、現代のWeb開発、特にコンテンツ管理とeコマースプラットフォームで依然として重要です。 1)PHPには、LaravelやSymfonyなどの豊富なエコシステムと強力なフレームワークサポートがあります。 2)パフォーマンスの最適化は、Opcacheとnginxを通じて達成できます。 3)PHP8.0は、パフォーマンスを改善するためにJITコンパイラを導入します。 4)クラウドネイティブアプリケーションは、DockerおよびKubernetesを介して展開され、柔軟性とスケーラビリティを向上させます。

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHPとPythonにはそれぞれ独自の利点があり、さまざまなシナリオに適しています。 1.PHPはWeb開発に適しており、組み込みのWebサーバーとRich Functionライブラリを提供します。 2。Pythonは、簡潔な構文と強力な標準ライブラリを備えたデータサイエンスと機械学習に適しています。選択するときは、プロジェクトの要件に基づいて決定する必要があります。

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

PHPが多くのWebサイトよりも優先テクノロジースタックである理由には、その使いやすさ、強力なコミュニティサポート、広範な使用が含まれます。 1)初心者に適した学習と使用が簡単です。 2)巨大な開発者コミュニティと豊富なリソースを持っています。 3)WordPress、Drupal、その他のプラットフォームで広く使用されています。 4)Webサーバーとしっかりと統合して、開発の展開を簡素化します。

PHPは、特にWeb開発の分野で、最新のプログラミングで強力で広く使用されているツールのままです。 1)PHPは使いやすく、データベースとシームレスに統合されており、多くの開発者にとって最初の選択肢です。 2)動的コンテンツ生成とオブジェクト指向プログラミングをサポートし、Webサイトを迅速に作成および保守するのに適しています。 3)PHPのパフォーマンスは、データベースクエリをキャッシュおよび最適化することで改善でき、その広範なコミュニティと豊富なエコシステムにより、今日のテクノロジースタックでは依然として重要になります。

PHPでは、弱い参照クラスを通じて弱い参照が実装され、ガベージコレクターがオブジェクトの回収を妨げません。弱い参照は、キャッシュシステムやイベントリスナーなどのシナリオに適しています。オブジェクトの生存を保証することはできず、ごみ収集が遅れる可能性があることに注意する必要があります。

\ _ \ _ Invokeメソッドを使用すると、オブジェクトを関数のように呼び出すことができます。 1。オブジェクトを呼び出すことができるように\ _ \ _呼び出しメソッドを定義します。 2。$ obj(...)構文を使用すると、PHPは\ _ \ _ Invokeメソッドを実行します。 3。ロギングや計算機、コードの柔軟性の向上、読みやすさなどのシナリオに適しています。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

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