3

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

我试图配合你的一些想法,试图通过标准输入从 python 发送数据到 C 应用程序:

测试.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;
}

测试.py:

def run(self):

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

然后我使用管道开始这整个事情:python test.py | 测试程序

不幸的是,在 test.exe 端没有收到数据,这个数据不应该在标准输入上可用吗?

4

2 回答 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。但是您必须修改这两个程序才能做到这一点。

编辑:JF Sebatian 关于在命令行上使用管道的评论非常真实,我忘记了!但是上述技术仍然有用,因为它是一个需要记住的命令,特别是如果你想在 python 和 C 程序之间进行双向通信(在这种情况下,你必须添加stdout=subprocess.PIPEsubprocess.Popen调用中,然后你的 python 程序可以读自p.stdout)。

于 2012-10-25T17:08:39.967 回答
3

已经提到:

  1. 插座(小心取景)
  2. 消息队列

新建议:

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

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

于 2012-10-25T18:59:26.677 回答