python函数主要通过接口与外界通信_不同编程语言的程序可不可以通过接口相互调用?...

我从两个方面进行回答,一个是本地调用,一个是远程调用。

一、本地调用

本地调用又两个方面阐述,一是不同进程(不同进行语言可能不一样)之间的通信;二是不同语言本地调用,这一点举了 几种常用的语言调用,其他的不再累赘:

1、不同进程之间主要通过以下方式进行通信(IPC调用)

进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。

2、C++ 跨语言调用 Java

Java JDK 提供了 JNI 接口供 C/C++ 程序调用 Java 编译后的类与方法,主要依赖于头文件(jni.h) 和 动态库(jvm.so/jvm.dll), JNI 包含了丰富的接口映射和跨语言的数据通信,非常复杂。

3、C、C++中调用Python

通过C++调用Python脚本,主要利用Python提供的API,实际上,C++主要调用的是Python的解释器,而Python的解释器本质就是实现在动态链接库里的,因此在调用前后要进行一些初始化和资源释放的工作,另外,要调用Python脚本里的函数等等,需要使用Python提供的一些特殊的API来包装C++调用。比如:初始化Python解释器,若初始化失败,继续调用会出现各种错误

void Py_Initialize(void)检查Python解释器是否初始化,返回0表示没有经过初始化

int Py_IsInitialized(void)反初始化解释器,包括子解释器,同时释放Python解释器占用的资源

void Py_Finalize()实际上是一个宏,执行Python代码

int PyRun_SimpleString(const char *command)导入一个模块,name是Python文件的文件名,不带.py,类似于Python内建的import

PyObject* PyImport_ImportModule(char *name)相当于Python模块对象的dict属性,得到模块名称空间下的字典对象

PyObject* PyModule_GetDict( PyObject *module)执行一段Python代码

PyObject* PyRun_String(const char* str, int start,PyObject* globals, PyObject* locals)把Python数据类型转换为C的类型

int PyArg_Parse(PyObject* args, char* format, ...)返回模块对象o的attr_name属性或函数,相当于Python中的表达式o.attr_name

PyObject* PyObject_GetAttrString(PyObject *o, char*attr_name)构建一个参数列表,将C类型转换为Python对象

PyObject* Py_BuildValue(char* format, ...)调用Python函数,两个参数都是Python对象指针,pfunc是要调用的Python函数,一般来说,可以用过PyObject_GetAttrString()获得,pargs是函数的参数列表,通常是Py_BuildValue()来构建的

PyObject* PyEval_CallObject(PyObject* pfunc, PyObject*pargs)

4、C#调用的C++库

提供了三种调用方式

(1)直接调用C++类库中的公共方法

使用DllImport特性对方法进行调用,比如一个C++类库SampleCppWrapper.dll中的公共方法:

extern “C” __declspec(dllexport) int __stdcall Add(int n1, int n2);

__stdcall表示调用约定:参数都是从右向左通过堆栈传递, 函数调用在返回前要由被调用者清理堆栈。

在C#中,调用如下:

[DllImport(“SampleCppWrapper.dll”)] private static extern int Add(int n1, int n2);

注意参数的类型,之后,可直接在C#编程中使用这个方法。

(2)调用C++类库中的类的方法

C#不能直接调用C++类库中的类,需要一种变通的解决方式,通过再做一个C++类库把要调用的类成员方法暴露出来

(3)使用C++类库中的回调函数

C++的回调函数是一种事件响应机制,和C#的委托相似,比如一个C++类中的回调函数:个人感觉与方法二大同小异,没有深入去探究,所以也就不太清楚功能上的优劣

二、远程调用

就是各种RPC了,RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

其中客户机,服务器都可能是不同的语言,也有可能相同。他们通过RPC实现了互通

目前常用的RPC协议有哪些呢?主要有CORBA,Java RMI,Web Service,Hessian,Thrift,XML-RPC,SOAP,HTTP等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值