如何实现 C/C++ 与 Python 的通信?

本文介绍了如何在C/C++与Python之间实现通信,包括使用subprocess进行系统调用、共享文件、网络套接字、PythonCAPI和C++扩展模块,以及通过IPC机制如中间件进行通信的选择和应用。
摘要由CSDN通过智能技术生成

实现C/C++与Python之间的通信可以通过多种方式,以下列举了几种常见的方法:

1. 使用系统调用(subprocess)

  • Python调用C/C++程序:Python可以使用subprocess模块启动一个C/C++编译的可执行程序作为子进程,并通过标准输入(stdin)、标准输出(stdout)和标准错误(stderr)管道进行通信。Python向C/C++程序的stdin写入数据,接收其stdout输出作为结果。
import subprocess

# 启动C/C++程序,假设名为cpp_program
proc = subprocess.Popen(['cpp_program'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

# 向C/C++程序的stdin写入数据
input_data = b'Hello from Python'
proc.stdin.write(input_data)
proc.stdin.close()  # 关闭stdin以通知C/C++程序输入结束

# 读取C/C++程序的stdout输出
output_data = proc.stdout.read()

# 等待子进程结束
proc.wait()

print(f"C/C++程序返回数据: {output_data.decode('utf-8')}")

为了帮助您更好地入门并深入掌握C++,我们精心准备了一系列丰富的学习资源包,包括但不限于基础语法教程、实战项目案例、核心概念解析以及进阶技巧指导等。

您只扫码上方二维码,即可免费获取这份专属的学习礼包。我们的教程覆盖了C++语言的各个方面,旨在让您在理论学习与实践操作中不断进步,提升编程技能。

同时,我们也鼓励您在学习过程中遇到任何问题时积极提问,我们会尽全力提供解答和帮助。期待您在C++编程的道路上越走越远,早日成为一位优秀的C++开发

 

在C/C++程序中,通过标准输入读取数据,标准输出返回结果:

#include <iostream>

int main() {
    std::string input;
    std::getline(std::cin, input);  // 从stdin读取一行数据

    std::cout << "Received: " << input << std::endl;  // 输出到stdout作为回应

    return 0;
}

2. 使用共享文件

  • C/C++程序写入文件:C/C++程序将结果写入到一个预先约定好的文件中。
  • Python读取文件:Python程序随后读取这个文件,获取C/C++程序的输出。

3. 使用网络套接字(Socket)

  • 网络通信:C/C++和Python分别作为客户端和服务器,或者两者互为客户端/服务器,通过TCP或UDP协议进行网络通信。这种方式允许两个程序在不同进程中甚至不同计算机上进行交互。

示例:Python作为服务器,C/C++作为客户端

Python(服务器端):

import socket

HOST = 'localhost'  # 服务器IP地址
PORT = 65432        # 服务器端口

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()

    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data)

C++(客户端):

#include <iostream>
#include <string>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

int main() {
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(65432);
    inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);

    connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr));

    std::string message = "Hello from C++";
    send(sock, message.c_str(), message.size(), 0);

    char buffer[1024];
    recv(sock, buffer, 1024, 0);
    std::cout << "Received: " << buffer << std::endl;

    close(sock);
    return 0;
}

4. 使用Python C API或C++扩展模块

  • Python C API:C/C++程序编写Python扩展模块,直接使用Python C API实现与Python的无缝集成。C/C++代码被编译为动态链接库(.so.pyd),Python脚本可以通过import语句加载并直接调用其中的函数。
  • C++扩展模块:使用工具如boost.pythonPyBind11Cython简化Python C API的使用,更便捷地创建Python可以调用的C++函数和类。

5. 使用中间件或消息队列

  • IPC机制:通过进程间通信(IPC)机制,如命名管道(FIFO)、消息队列(Message Queue)、共享内存等进行通信。
  • 中间件:使用诸如ZeroMQ、Redis Pub/Sub、RabbitMQ等中间件作为消息传递层,C/C++和Python各自连接到中间件,通过发送和接收消息进行交互。

根据实际需求(如数据交换的实时性、数据量、跨进程/跨平台需求等)选择合适的方法实现C/C++与Python之间的通信。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值