目次
C/Python 間の呼び出し関係
方法/手順
Pythonモジュールを呼び出すC++の詳細な分析
ホームページ バックエンド開発 PHPチュートリアル C/Python_PHP間の呼び出し関係チュートリアル

C/Python_PHP間の呼び出し関係チュートリアル

Jul 12, 2016 am 08:54 AM
android

C/Python 間の呼び出し関係

Python には強力なオープンソース ライブラリが多数あるため、C はそれらのライブラリからメソッドを借用して、より多くの関数を完成させることができます。

そのため、CからPythonを呼び出す方法は特に重要です。

方法/手順

  1. ubuntu 14.04 linux c

    gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2

    Python 2.7.6

  2. 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;

    }


    3

    root@linux:~/code# gcc -o c_call_python c_call_python.c -lpython2.7

    root@linux:~/code# ./c_call_python 12 15

    12 + 15 = 27

    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>
    ログイン後にコピー

    3 Python モジュールをロードして関数を呼び出します

    ~/test ディレクトリには test.py:

    <code class="python hljs ">def test_add(a, b):print 'add ', a, ' and ', breturn a+b</code>
    ログイン後にコピー
    が含まれています

    次のコードを通じて test_add 関数を呼び出すことができます:

    <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>
    ログイン後にコピー

    パラメータの受け渡し

    1 C++ Python にパラメータを渡す

    Python パラメータは実際にはタプルなので、パラメータを渡すことは実際には適切なタプルを構築することになります。

    一般的に使用されるメソッドは 2 つあります:

    PyTuple_New を使用してタプルを作成し、PyTuple_SetItem を使用してタプル値を設定します

    <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>
    ログイン後にコピー

    Py_BuildValue を直接使用してタプルを構築します

    <code class="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 ガベージ コレクション用)。

    www.bkjia.com本当http://www.bkjia.com/PHPjc/1121870.html技術記事 C/Python 間の呼び出し関係 Python には強力なオープンソース ライブラリが多数あるため、C はそれらのライブラリからメソッドを借用して、より多くの関数を完成させることができます。 したがって、CからPythonを呼び出す方法は特に重要です。 方法...

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

新しいレポートは、噂のSamsung Galaxy S25、Galaxy S25 Plus、Galaxy S25 Ultraのカメラアップグレードのひどい評価を提供します 新しいレポートは、噂のSamsung Galaxy S25、Galaxy S25 Plus、Galaxy S25 Ultraのカメラアップグレードのひどい評価を提供します Sep 12, 2024 pm 12:23 PM

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

Samsung Galaxy S25 Ultraの最初のレンダリング画像がリークされ、噂のデザイン変更が明らかに Samsung Galaxy S25 Ultraの最初のレンダリング画像がリークされ、噂のデザイン変更が明らかに Sep 11, 2024 am 06:37 AM

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

IFA 2024 | TCLのNXTPAPER 14は、パフォーマンスではGalaxy Tab S10 Ultraに匹敵しませんが、サイズではほぼ匹敵します IFA 2024 | TCLのNXTPAPER 14は、パフォーマンスではGalaxy Tab S10 Ultraに匹敵しませんが、サイズではほぼ匹敵します Sep 07, 2024 am 06:35 AM

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

新しいレポートは、噂のSamsung Galaxy S25、Galaxy S25 Plus、Galaxy S25 Ultraのカメラアップグレードのひどい評価を提供します 新しいレポートは、噂のSamsung Galaxy S25、Galaxy S25 Plus、Galaxy S25 Ultraのカメラアップグレードのひどい評価を提供します Sep 12, 2024 pm 12:22 PM

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

Vivo Y300 Pro は、7.69 mm のスリムなボディに 6,500 mAh のバッテリーを搭載 Vivo Y300 Pro は、7.69 mm のスリムなボディに 6,500 mAh のバッテリーを搭載 Sep 07, 2024 am 06:39 AM

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

Samsung Galaxy S24 FEは、4色と2つのメモリオプションで予想よりも低価格で発売されると請求されています Samsung Galaxy S24 FEは、4色と2つのメモリオプションで予想よりも低価格で発売されると請求されています Sep 12, 2024 pm 09:21 PM

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

Xiaomi Redmi Note 14 Pro Plusは、Light Hunter 800カメラを搭載した初のQualcomm Snapdragon 7s Gen 3スマートフォンとして登場します Xiaomi Redmi Note 14 Pro Plusは、Light Hunter 800カメラを搭載した初のQualcomm Snapdragon 7s Gen 3スマートフォンとして登場します Sep 27, 2024 am 06:23 AM

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 Razr 50s は初期リークで新たな予算を折り畳める可能性があることを示す Motorola Razr 50s は初期リークで新たな予算を折り畳める可能性があることを示す Sep 07, 2024 am 09:35 AM

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

See all articles