Python が C/C++ の基礎となるライブラリを呼び出し、相互に値を転送する方法の詳細な説明
スクリプト解釈言語としての Python は C++ とよく統合されているため、パフォーマンスが必要な場合に Python を使用して C/C++ の基礎となるライブラリを開発および呼び出すことは単なる成果物です。この記事では、Python が C/C++ の基礎となるライブラリを呼び出し、相互に値を渡し合う問題について詳しく紹介します。
はじめに
開発環境:
Centos 7 + Python 3.5.1 + Qt Creator (QTのライブラリを使用せず、Qt Creatorでコンパイルしただけです)
PythonはC /C++を呼び出しますライブラリを使用するには、今できる方法が 2 つあります
1.extern "C" export (値を相互に渡すのはさらに面倒なので、この方法はお勧めしません):
Export C/ C++ ライブラリは、通常と同じ DLL または .so に作成されます。例:
//.h文件 #include <Python.h> //.cpp文件 //C/C++ my.so 或者my.dll enter "C" void printHello() { std::cout<<"Hello World"<<std::endl; }
#Python import ctypes from ctypes import * loadso = ctypes.cdll.LoadLibrary mylib = loadso("./my.so") mylib.printHello() >>>Hello world
コードの説明:
my.so C エクスポート関数があります printHello()
import ctypes : 名前が示すように、公式ライブラリをインポートします
loadso = ctypes.cdll.LoadLibrary :loadsoはライブラリのロードに使用される関数を表します
mylib =loadso(" ./my.so") //orloadso("my.dll") my.soライブラリをロード
mylib.printHello(): ライブラリ関数を呼び出す
上記のコードは正常に出力できます: Hello World 、しかし、それらは互いに値を渡しません
PythonとC++ 値の受け渡し
//.h文件 #include <Python.h> //.cpp文件 enter "C" int printHello(const char* str) { std::cout<<str<<std::endl; return 1; }
そしてPythonの問題が来ます
str = create_string_buffer(b"Hello World") #mylib.printHello("Hello World") 这里死活就是显示:H,*(str+4)才是'e',*(str+8) 是'l' 依次类推 print (mylib.printHello(str)) >>>Hello World >>>1 #由于对Python不是特别的熟悉 怎么也做不到显示C++返回的字符串, Python只能显示C++返回的字符串子能看到一个地址而已
2。
特に言うことはありません。コードにアクセスしてください
//.h文件 本来这是C++连接Mysql 我只摘抄部分代#include <Python.h> //.cpp文件 //传递多个参数 Python传过来的参数在args里面 PyObject* printfHello(PyObject* self,PyObject* args) { int i=0 const char* str; if (!PyArg_ParseTuple(args, "i|s", &i,&str)) //i 表示整形 s 表示字符串 return PyLong_FromLong(0); print("%d,%s",i,str); return Py_BuildValue("s","OK"); //向Python返回OK字符串 } //映射 知道MFC的一看就懂 static PyMethodDef MyMethods[] = { {"printfHello", printfHello, METH_VARARGS, //"printHello" 中可调用的函数 METH_VARARGS :带有参数 METH_NOARGS:无参数 "print"}, //说明 {"connect", connect, METH_VARARGS, "connect mysql"}, {NULL, NULL, 0, NULL} }; static PyObject* UtilError; // 向Python中注册模块 static struct PyModuleDef spammodule = { PyModuleDef_HEAD_INIT, "libMysqlUtil", //模块名字 import libMysqlUtil "C++ Connect Mysql", -1, MyMethods };//PyInit_libMysqlUtil 注意名字 一定要PyInit_ 加上你的模块名字 不然Python import 会提示没有定义 PyInit_你的模块名字 PyMODINIT_FUNC PyInit_libMysqlUtil(void) { PyObject* m = nullptr; m = PyModule_Create(&spammodule); //m= Py_InitModule(....) Python 2.7 if(!m) { return m; } UtilError = PyErr_NewException("Util.error",NULL,NULL); Py_INCREF(UtilError); PyModule_AddObject(m,"error",UtilError); return m; }
#python import libMysqlUtil libMysqlUtil.printHello(1,"hello World") >>>1,hello World >>>OK
概要
これまでのところ、Python と C/C++ は相互に通信し、ほとんどの機能に適応できます構造体の値の転送についてはまだ研究されていません。C++ ではポインタを使用します。Python が整数を C++ に渡すときは、PyArg_ParseTuple を使用します。整数をクラス ポインタに変換します。
Python が C/C++ の基礎となるライブラリを呼び出し、値を相互に転送する方法の詳細については、PHP 中国語 Web サイトに注目してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

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

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

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

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

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

ホットトピック











LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

Investing.comの反クラウリング戦略を理解する多くの人々は、Investing.com(https://cn.investing.com/news/latest-news)からのニュースデータをクロールしようとします。
