【问题标题】:Pipe between a C and a Python programC 和 Python 程序之间的管道
【发布时间】:2020-11-03 18:46:18
【问题描述】:

我目前正在尝试编写一个与硬件交互的 C 程序,我选择这样做是因为硬件制造商为此硬件提供了 C SDK。但是,我希望这个 C 程序将它从硬件(例如传感器)接收到的数据输出到管道,这样我就可以编写一个 Python 程序来获取数据并对其进行解析并对其进行一些分析。我在 Raspberry Pi (Linux) 上运行这些程序。如何在这两个不同的程序(Python 和 C)之间创建管道?我可以通过管道位置来做到这一点吗?

【问题讨论】:

  • popen() 可用于管道,而 execl() 可用于执行程序/文件。其他的不清楚。
  • 无论是 C、Python、Perl、Ruby、Haskell 还是 Lisp,机制都是一样的。您将数据写入管道的一侧,而另一个进程从另一侧读取数据。管道不关心用于生成或使用数据的语言。
  • 您可能需要考虑使用单个进程,而不是使用需要进程间通信的两个进程。您可以使用ctypes 使python 代码能够调用C 代码。
  • 听起来你可能想看看 Unix 域套接字,而不是管道。

标签: python c linux raspberry-pi pipe


【解决方案1】:

由于您只想在一个方向上传输数据,因此无需在代码中创建管道。

最简单的方法是让操作系统通过将数据写入 C 程序中的 stdout 并在 Python 中从 stdin 中读取数据来为您传输数据。

你会像这样运行程序:

mycprog | python myscript.py

在 C 代码中,你会使用类似的东西:

#include <stdio.h>

unsigned char buffer[BUFFER_SIZE];
/* read from sensor to buffer */
fwrite(sensor_buffer, sizeof(usigned char), BUFFER_SIZE,  stdout);

在 Python 端,代码如下所示:

import sys

sensor_bytes = sys.stdin.read(BUFFER_SIZE)

您也可以使用popen 直接从 C 代码启动 Python 脚本,但这会降低您的解决方案的灵活性,并且如果您想将数据发送到另一个脚本或程序,则必须更改 C 代码.

最后,如果你不想依赖 shell,或者你想在不同的 shell 中运行你的两个程序,你可以使用mkfifo 创建一个命名管道。

Here is a detailed example.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多