在python脚本和C app之间不断进行通信

时间:2012-10-25 16:03:04

标签: 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上提供这个数据吗?

2 个答案:

答案 0 :(得分:3)

有几种可能的方式。

您可以使用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()

或者,您可以使用socket。但你必须修改两个程序才能做到这一点。

编辑:J.F Sebatian关于在命令行使用管道的评论是非常正确的,我忘记了!但是上面提到的技术仍然很有用,因为它只需要记住一个命令,特别是如果你想在python和C程序之间进行双向通信(在这种情况下你必须将stdout=subprocess.PIPE添加到{{} 1}}调用,然后你的python程序可以从subprocess.Popen读取。

答案 1 :(得分:2)

已经提到:

  1. 插座(小心框架)
  2. 消息队列
  3. 新建议:

    1. ctypes(将C代码打包为共享对象并调用它 来自python with ctypes)
    2. Cython / Pyrex(类似Python的语言,可以让你漂亮 自由混合python和C数据)
    3. SWIG(中介语接口系统)
    4. 事实上,套接字和消息队列可能是更安全的方式。但它们可能也意味着更多代码更改。