Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erklärung, wie Python die zugrunde liegenden C/C++-Bibliotheken aufruft und Werte untereinander überträgt

Detaillierte Erklärung, wie Python die zugrunde liegenden C/C++-Bibliotheken aufruft und Werte untereinander überträgt

高洛峰
高洛峰Original
2017-02-20 10:32:431624Durchsuche

Python ist als Skriptinterpretationssprache gut in C++ integriert. Daher ist die Verwendung von Python zum Entwickeln und Aufrufen der zugrunde liegenden C/C++-Bibliothek, bei der Leistung erforderlich ist, lediglich ein Artefakt. In diesem Artikel wird ausführlich auf das Problem eingegangen, dass Python die zugrunde liegenden C/C++-Bibliotheken aufruft und Werte untereinander überträgt.

Vorwort

Entwicklungsumgebung:

Centos 7 + Python 3.5.1 + Qt Creator (nur mit Qt Creator kompiliert und verwendet keine QT-Bibliotheken)

Python ruft C/C++-Bibliotheken auf. Es gibt jetzt zwei Möglichkeiten, dies zu tun

1.externer „C“-Export (Werte aneinander zu übergeben ist problematischer, diese Methode wird nicht empfohlen):

Machen Sie die C/C++-Bibliothek zur gleichen DLL oder .so wie gewohnt, zum Beispiel:

//.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

Code-Erklärung:

my.so Es gibt eine C-Exportfunktion printHello()

Import ctypes: Importieren Sie eine offizielle Bibliothek, wie der Name schon sagt, sie ist mit C verwandt

loadso = ctypes.cdll.LoadLibrary:loadso stellt die Funktion dar, die zum Laden der Bibliothek verwendet wird

mylib = Loadso(“./my.so”)  //Oder Loadso(“my.dll”) Laden Sie die my.so-Bibliothek

mylib .printHello(): Rufen Sie die Bibliotheksfunktion auf

Der obige Code kann normal ausgeben: Hallo Welt, aber sie übergeben keine Werte aneinander

Python und C++ übergibt Werte aneinander

//.h文件
#include <Python.h>
//.cpp文件
enter "C" int printHello(const char* str)
{
  std::cout<<str<<std::endl;
  return 1;  
}

Dann kommt das Problem mit Python

str = create_string_buffer(b"Hello World")
#mylib.printHello("Hello World") 这里死活就是显示:H,*(str+4)才是&#39;e&#39;,*(str+8) 是&#39;l&#39; 依次类推
print (mylib.printHello(str))
>>>Hello World
>>>1
#由于对Python不是特别的熟悉 怎么也做不到显示C++返回的字符串, Python只能显示C++返回的字符串子能看到一个地址而已

2. Python-Erweiterung C/ C++

Nicht viel zu sagen, gehen Sie einfach zum Code

//.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

Zusammenfassung

Also Bisher ist die Kommunikation zwischen Python und C++ für die meisten Anforderungen noch nicht untersucht. In C++ werden Zeiger in Ganzzahlen umgewandelt Python übergibt die Ganzzahlen an C++, PyArg_ParseTuple wird verwendet, um die Ganzzahlen in Klassenzeiger umzuwandeln.

Ausführlichere Erklärungen, wie Python die zugrunde liegenden C/C++-Bibliotheken aufruft und Werte untereinander überträgt, finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn