Python与其他语言交互方式总结

B站影视 电影资讯 2025-03-31 15:01 2

摘要:Python与其他编程语言的交互可以通过多种方式实现,具体方法取决于需求场景(如性能、开发便捷性、系统架构等)。以下是主要的交互方式及示例:

Python与其他编程语言的交互可以通过多种方式实现,具体方法取决于需求场景(如性能、开发便捷性、系统架构等)。以下是主要的交互方式及示例:

1. 调用C/C++代码

a. ctypes库

原理:直接调用动态链接库(.dll/.so)。步骤:编写C代码并编译为动态库。使用ctypes加载库并调用函数。示例

c

// add.c

int add(int a, int b) { return a + b; }

bash

# 编译为动态库

gcc -shared -o libadd.so add.c # Linux

cl /LD add.c # Windows(生成add.dll)

python

# Python调用

from ctypes import cdll

lib = cdll.LoadLibrary('./libadd.so')

print(lib.add(3, 4)) # 输出7

b. Cython

原理:将Python代码转换为C并编译为扩展模块。步骤:编写.pyx文件。使用setup.py编译生成模块。示例

cython

# add.pyx

cdef extern from "add.h":

int add(int a, int b)

def py_add(int a, int b):

return add(a, b)

python

# setup.py

from distutils.core import setup

from Cython.Build import cythonize

setup(ext_modules=cythonize('add.pyx'))

2. 与java交互

a. Jython

原理:在JVM上运行Python,直接调用Java类。示例

python

from java.util import ArrayList

lst = ArrayList

lst.add("Hello")

print(lst.size) # 输出1

b. Py4J

原理:通过Socket通信调用Java方法。步骤:Java端启动网关服务。Python端通过Py4J连接调用。Java示例

java

// JavaClass.java

public class JavaClass {

public int add(int a, int b) { return a + b; }

}

Python调用

python

from py4j.java_gateway import JavaGateway

gateway = JavaGateway

java_class = gateway.jvm.JavaClass

print(java_class.add(3, 4)) # 输出7

3. 与.NET交互(IronPython)

原理:在.NET平台上运行Python,调用.NET程序集。示例

python

import clr

clr.AddReference("System.Windows.Forms")

from System.Windows.Forms import MessageBox

MessageBox.Show("Hello from IronPython")

4. 网络通信(HTTP/grpc)

a. REST API

Python作为客户端

python

import Requests

response = requests.get('https://api.example.com/data')

print(response.JSON)

b. gRPC

步骤:定义.proto文件。生成Python和服务端代码。示例

protobuf

// example.proto

service Greeter {

rpc SayHello (HelloRequest) returns (HelloReply) {}

}

message HelloRequest { string name = 1; }

message HelloReply { string message = 1; }

python

# Python客户端

import grpc

from example_pb2_grpc import Greeterstub

channel = grpc.insecure_channel('localhost:50051')

stub = GreeterStub(channel)

response = stub.SayHello(HelloRequest(name="World"))

print(response.message) # 输出 "Hello, World!"

5. 子进程调用

原理:通过subprocess模块调用其他语言的可执行文件。示例

python

import subprocess

result = subprocess.run(['./c_program'], capture_output=True, text=True)

print(result.stdout)

6. 数据交换(文件/数据库)

a. 共享文件(json/CSV)

python

# Python写入JSON

import json

data = {"name": "Alice", "age": 30}

with open("data.json", "w") as f:

json.dump(data, f)

b. 数据库(SQLAlchemy)

python

from sqlalchemy import create_engine

engine = create_engine('sqlite:///data.db')

engine.execute("INSERT INTO users (name, age) VALUES ('Bob', 25)")

7. 消息队列(RabbitMQ/Kafka)

Python使用pika库

python

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))

channel = connection.channel

channel.queue_declare(queue='hello')

channel.basic_publish(exchange='', routing_key='hello', body='Hello from Python!')

connection.close

选择建议

性能敏感:使用C扩展/Cython。跨平台服务:HTTP/gRPC或消息队列。JVM/.NET集成:Jython/IronPython。快速原型:子进程调用或文件交换。

通过合理选择交互方式,Python能高效整合不同语言的优势,构建灵活的系统架构。

来源:老客数据一点号

相关推荐