在Python脚本和C应用程序之间连续通信



我有一个python脚本,该脚本与某些网络池接口以读取数据连续320位。这个320位应该转到某个C应用程序,该应用程序不断地从Python脚本中读取这320位,并将它们放入int阵列[8]。老实说,我根本不知道这是否可能是可能的,也要感谢这个问题的起点。

我试图启动您的一些想法,试图通过stdin从Python发送数据到C App:

test.exe:

#include <stdio.h>
int main(void)
{
    int ch;
    /* read character by character from stdin */
    do {
    ch = fgetc(stdin);
    putchar(ch);
    } while (ch != EOF);

    return 0;
}

test.py:

def run(self):
    while True:           
        payload = 'some data'
        sys.stdout.write(payload)
        time.sleep(5)

然后我使用管道开始整个过程:python test.py |test.exe

不幸的是,test.exe方面没有收到的数据,是否应该在stdin上使用此数据ba?

有几种可能的方法。

您可以使用subprocess模块从Python程序启动C程序。在这种情况下,您可以从Python程序写入C程序的标准输入。这可能是最简单的方法。

import subprocess
network_data = 'data from the network goes here'
p = subprocess.Popen(['the_C_program', 'optional', 'arguments'], 
                     stdin=subprocess.PIPE)
p.stdin.write(network_data)

n.b。如果要多次发送数据,则应不是使用Popen.communicate()

另外,您可以使用套接字。但是您必须修改两个程序才能做到这一点。

编辑:J.F Sebatian关于在命令行上使用管道的评论是非常真实的,我忘记了!但是上述技术仍然很有用,因为它是一个较少记住的命令,尤其是如果您想在Python和C程序之间进行双向通信(在这种情况下,您必须将stdout=subprocess.PIPE添加到subprocess.Popen调用中,然后将其添加到Python中程序可以从p.stdout读取)。

已经提到了:

  1. 插座(要小心框架)
  2. 消息队列

新建议:

  1. ctypes(将C代码作为共享对象打开并打电话给它从python带有ctypes)
  2. Cython/Pyrex(一种类似Python的语言,可以让您漂亮自由混合Python和C数据)
  3. swig(一种中间语言接口系统)

实际上,插座和消息队列可能是一种更安全的方法。但是它们可能也意味着更多的代码更改。

最新更新