通信连续运行的C和Python应用程序之间的数据(Communicate data between

2019-10-23 03:07发布

有没有一种办法之间连续运行的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不是一种选择,因为代码太大。

我想用进程ID,并可能进行通信之间的数据插口 ,但不能确定,需要一些建议。

其目的是在Windows做到这一点,但统一的单一实施效果会更好。

Answer 1:

你有几个选项

  1. 通过标准输入和输出到标准输出传递数据。

你必须制定一个基于行的格式,从stdin读取一行并打印你想要传达给父进程的东西。

见下面的例子

  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平pongs和P1 P2通知,它必须杀死自己。 该工艺可长期运行。



文章来源: Communicate data between C and Python apps running continuously