You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash循环调用C与Python程序时,如何实现二者的数据共享?

问题描述

我正在开发一个包含多个C和Python文件的项目,通过Linux终端的Bash脚本实现菜单功能,脚本提供「Loop」和「Quit」选项。选择「Loop」后会循环执行C程序和Python程序,脚本代码如下:

#!/bin/bash

PS3='Please enter your choice: '
options=("Loop" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "Loop")
            echo "Looping the programs"
            while [ <some test> ]
            do
                  ./cprogram1 arg1 arg2 arg3 ... #调用C程序
                   python3 pythonprogram1.py     #调用Python程序
                   sleep .5 # 等待0.5秒
            done
            ;;
        "Quit")
            break
            ;;
        *) echo "invalid option $REPLY";;;
    esac
done

需求是让C程序cprogram1输出的数据cprog1data被Python程序pythonprogram1.py获取,我考虑通过log.txt文件(C写入、Python读取)实现,请问该方案是否可行?有没有更高效的替代方法?


方案分析与替代方法

一、log.txt文件方案的可行性

该方案完全可行,实现逻辑简单:

  • C程序通过标准文件IO(如fopen/fwrite)将数据写入log.txt,注意写完后要调用fflush刷新缓冲区,避免数据滞留在内存中;
  • Python程序通过open函数读取文件内容,读取前可以检查文件是否存在、是否有新内容,或者每次循环清空文件避免旧数据干扰。

但该方案存在几个需要注意的点:

  • 要处理读写同步问题:比如C程序还没写完,Python就开始读取,导致数据不完整;可以通过加文件锁(C用flock,Python用fcntl模块),或者C写完后写入一个标记(比如末尾加特定字符串),Python读取到标记再处理数据;
  • 频繁读写文件会带来磁盘IO开销,如果循环频率高、数据量大,性能会受影响;
  • 容易出现数据覆盖问题:如果循环中C程序每次都覆盖文件,要确保Python在下次写入前读完数据;如果是追加,Python需要记录上次读取的位置,避免重复处理旧数据。

二、更高效的替代方法

1. 管道(Pipe)

这是最常用且高效的进程间通信方式,直接通过Bash将C程序的标准输出(stdout)传给Python程序的标准输入(stdin),不需要中间文件:
修改Bash脚本中的循环部分:

while [ <some test> ]
do
    ./cprogram1 arg1 arg2 arg3 ... | python3 pythonprogram1.py
    sleep .5
done
  • C程序只需将cprog1data输出到stdout(比如用printf/puts,注意刷新缓冲区);
  • Python程序通过sys.stdin读取数据,示例代码:
import sys

data = sys.stdin.read()
# 处理data

优点:无磁盘IO开销,数据直接在进程间传递,实现简单,性能高。

2. 命令行参数

如果cprog1data数据量小(符合命令行参数长度限制),可以让C程序输出数据,然后通过Bash将其作为参数传给Python:
修改Bash脚本:

while [ <some test> ]
do
    c_data=$(./cprogram1 arg1 arg2 arg3 ...)
    python3 pythonprogram1.py "$c_data"
    sleep .5
done
  • C程序将数据输出到stdout;
  • Python程序通过sys.argv获取参数,示例代码:
import sys

data = sys.argv[1]
# 处理data

优点:实现极简,适合小数据场景;缺点:数据长度有限制,且要注意特殊字符(如空格、换行)的转义问题。

3. 共享内存

适合大数据量、低延迟的场景,C和Python直接操作同一段内存区域:

  • C端:使用shmget/shmat等系统调用创建、挂载共享内存,写入数据;
  • Python端:使用multiprocessing.shared_memory模块或mmap模块访问共享内存,读取数据。
    优点:内存级别的通信,性能极高;缺点:实现复杂,需要处理内存同步、数据格式解析等问题。

4. Unix域套接字

适合需要持续、双向通信的场景,比网络套接字更高效(无需网络协议栈开销):

  • C端:使用socket API创建AF_UNIX类型的套接字,监听并发送数据;
  • Python端:使用socket模块连接Unix套接字,接收数据。
    优点:支持双向通信,适合复杂交互场景;缺点:代码量比管道多,需要处理套接字的创建、绑定、连接等逻辑。

内容的提问来源于stack exchange,提问作者darthMaul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 08:33:25