Python脚本与C应用程序之间的持续通信

4
我有一个 Python 脚本,与某些网络池进行接口以读取数据。这些数据不断变化,长度为 320 位。这 320 位应该被转发到某个 C 应用程序中,该应用程序不断地从 Python 脚本中读取这些 320 位并将它们放入一个 int 数组 [8] 中。说实话,我不知道这是否可能,并且会感谢您给出这个问题的一个起点。
我尝试了一些您的想法,尝试通过 stdin 从 Python 向 C 应用程序发送数据:
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上可用吗?


“我会感激您提供这个问题的起点。” - 您可以从这里开始:http://beej.us/guide/bgipc/ - Robᵩ
C程序已经存在了吗?如果没有,你可以将它编写为Python扩展。如果有的话,你还需要进行修改。你对C程序有多少自由度? - Joe
可以推荐使用0mq吗? - Doug T.
谢谢大家,有了C程序,我拥有了所有需要的自由,完全在我的掌控之下 :) - Patrick
在睡眠之前,您可以添加 sys.stdout.flush() - jfs
2个回答

6

有几种可能的方法。

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

注意,如果您想多次发送数据,则不应使用Popen.communicate()

或者,您可以使用socket。但是您需要修改两个程序才能这样做。

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


最简单的方法是:python script.py | c_program - jfs

3

已经提到过的:

  1. 套接字(关注数据帧)
  2. 消息队列

新的建议:

  1. ctypes(将C代码打包为共享对象并使用ctypes从python中调用)
  2. Cython/Pyrex(一种类似于Python的语言,允许您自由混合python和C数据)
  3. SWIG(一种跨语言接口系统)

事实上,套接字和消息队列可能是更安全的选择。但这也可能意味着需要更多的代码更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接