【问题标题】:Run C code from python and listen to a variable value从 python 运行 C 代码并监听变量值
【发布时间】:2017-11-11 16:20:35
【问题描述】:

我有一个 C 代码(传感器的 SDK),当我运行它时,它会通过 USB 启动与传感器的连接,然后通过回调监听传感器输出并打印它(我也在文本文件上编写)。在此回调中每 50 毫秒打印一个样本。

现在我想从 Python 运行这个 C 代码(因为我需要在 python 中实时分析数据)并且每当 C 中的回调函数生成一个新的输出(一个 16*1 的整数数组)时,我需要将它们传递给 python 代码。

我见过很少的方法来运行 C 代码,例如 Swig,但我认为这些方法在您调用 C 代码并获得它们的返回值时使用。 但就我而言,C 代码处于无限循环中,并且在主代码中不返回任何内容。我也没有这个选项从传感器中逐个读取样本,因为每次运行 C 代码时,我都应该通过 USB 连接到传感器,然后能够读取值,连接到传感器需要时间,我不能这样做一直都是。

这是我用来连接传感器和读取值的 SDK(C 代码)。 https://www.dropbox.com/s/s5rrrdy4mzrv54f/Main.c?dl=0

我不是软件工程师,所以我可能不擅长预先编码。 谁能帮我解决这个问题?

谢谢。

【问题讨论】:

  • 你可能会考虑开发一个custom C module
  • 看看ctypes。恕我直言,甚至可以使用它进行回调。
  • 看看 Cython。

标签: python c wrapper


【解决方案1】:

您可以使用 ctypes 或其他绑定代码对 Python 进行“回调”,但这意味着您的 Python 代码会“妨碍”您的 C 代码 - 每当您运行 Python 代码时,您都不会检查来自传感器。

有时,越简单越好:您可以将值写入文件,然后从单独的 Python 进程中懒惰地读取该文件。

如果你不希望文件增长,你可以使用命名管道,如果你在 Unix 上。或者也许只是使用 redis 将值放入队列中。

否则,只需将相关的 PythonAPI 代码添加到您的 C 程序中,以便您可以使用 Python multiprocessing.Queue 对象并将您的值放在那里,然后使用 multiprocessing 启动进程以运行您的 C 代码。

https://docs.python.org/3/library/multiprocessing.html#pipes-and-queues

这将要求您编写 C 代码,以便可以从 Python 调用它,并将队列作为参数。然后,您的 C 代码可以继续池化传感器,而 Python 端使用这些值。

(TL;DR: 检查你的 C 示例,看起来你在 Linux 上。所以我的第一个建议对你来说是最简单的 - 使用 NamedPipe 和单独的 Python 程序来处理值。在 C 端,你不需要什么 - 只需创建命名管道,它将记录读取数据的文件发送到http://www.tldp.org/LDP/lpg/node15.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-20
    • 2021-12-24
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多