在连续运行的 C 和 Python 应用程序之间传递数据

Posted

技术标签:

【中文标题】在连续运行的 C 和 Python 应用程序之间传递数据【英文标题】:Communicate data between C and Python apps running continuously 【发布时间】:2015-05-14 16:03:43 【问题描述】:

有没有办法在连续运行的 C 程序和连续运行的 Python 程序之间传递数据? C 程序首先启动很重要。

到目前为止,我有(对于 C 端):

void run_cmd(char *cmd[])

    int parentID = getpid();
    char str[1*sizeof(double)];
    sprintf(str, "%d", parentID);
    char* name_with_extension;
    name_with_extension = malloc(2+strlen(cmd[1])+1*sizeof(int)+1);
    strcat(name_with_extension, cmd[1]);
    strcat(name_with_extension, " ");
    strcat(name_with_extension, str);

    pid_t pid;
    char *argv[] = "sh", "-c", name_with_extension, NULL;
    int status;
    //printf("Run command: %s\n", cmd);
    status = posix_spawn(&pid, "/bin/sh", NULL, NULL, argv, environ);
    if (status == 0) 
        //printf("Child pid: %i\n", pid);
        //printf("My process ID : %d\n", getpid());

        //if (waitpid(pid, &status, 0) != -1) 
        //    printf("Child exited with status %i\n", status);
        // else 
        //    perror("waitpid");
        //

        //part below is not tested and will probably not work
        int myout[2];
        pipe(myout);
        int status;
        int ch;
        do 
            if (read(myout[0], &ch, 1)>0)
                write(1, &ch, 1);
            
            waitpid(pid, &status, WNOHANG);
         while (!WIFEXITED(status) && !WIFSIGNALED(status));

    

对于 Python,我现在只能使用以下方法获取参数列表:

print 'Arguments ', str(sys.argv)

据我了解,subprocess.Popen 不是一个可行的方法,因为它会创建一个我不想要的新进程。

在 Python 中嵌入(或反向)C 不是一种选择,因为代码太大。

我认为使用进程 IDs 和可能的 sockets 之间的通信数据,但不确定并需要一些建议.

目标是在 Windows 中实现这一点,但统一的单一实现会更好。

【问题讨论】:

您的代码中有 未定义的行为malloc 函数不会初始化它分配的内存,因此当您调用 strcat 时,它会查找字符串终止符可能不在分配的内存中,您可能会超出分配的内存范围。 @JoachimPileborg 该代码仅用于测试。如果重要,程序运行如下:./c_prog ./py_prog,其中py_prog在启动时接收父端口号 @MocialovBoris 修复你已经知道错误的地方,(因为 Joachim 发布的内容),否则它可能会搞砸你未来的调试。至于“有没有办法在连续运行的C程序和连续运行的Python程序之间传递数据?”,那么当然有。 @MartinJames 哦,我错过了这样的答案 另一个选项是基于文件系统的 FIFO 队列。 【参考方案1】:

你有几个选择

    通过标准输入传递数据并输出到标准输出。

您必须设计一种基于行的格式,从标准输入读取一行并打印您想要与父进程通信的内容。

请看下面的例子

    使用 IPC 机制进行进程通信

在此我建议使用 zmq。它是跨平台的,并且有很多功能。

因此,python 中的一些代码显示了标准输入/标准输出通信的一般概念

P1(孩子)

import sys                             
import time                            
i=0                                    
while True:                            
    line = sys.stdin.readline().strip()
    if not line:                       
        time.sleep(0.5)                

    if line=="ping":                   
        sys.stdout.write("pong\n")     
        sys.stdout.flush()             
        i+= 1                          

    if i > 10:                         
        sys.stdout.write("exit\n")     
        sys.stdout.flush()    

P2(主人)

import subprocess                                                                             

p = subprocess.Popen(['python', './p1.py'],stdout=subprocess.PIPE, stdin=subprocess.PIPE)     
while True:                                                                                   
    p.stdin.write("ping\n")                                                                   
    p.stdin.flush()                                                                           
    ret = p.stdout.readline().strip()                                                         
    print ret                                                                                 
    if ret=='exit':                                                                           
        exit(0)

P2 开始 P1,他们打了 10 次乒乓球,然后 p1 通知 p2 它必须杀死自己。这些进程可能会长时间运行。

【讨论】:

标准输入和标准输出的意思是这样的:“ifconfig | grep en0”,对吧?然后我不知道如何将其扩展到连续运行的程序。 @MocialovBoris,我稍后会发布一个示例 @MocialovBoris 两者都在 python 中,因为我不确定 windows 的做事方式,但在 c 中会是类似的。 感谢您的建议,但我发现 FIFO 队列简单明了

以上是关于在连续运行的 C 和 Python 应用程序之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章

在c语言编程中,传值方式和传引用方式之间有啥区别?

在长时间运行的 c 进程和 python 之间进行双向 IPC 的最佳方法是啥?

在 C# 上运行 python 脚本并连续获取输出

android两个activity之间传值

传递元组嵌入式 Python

C#-一种窗体之间传值的方法