Windows上的Python和C之间的IPC

时间:2017-10-18 10:50:29

标签: python c windows subprocess ipc

我试图在Python程序和C程序之间建立通信。 这个项目的Python部分管理应用程序逻辑和GUI,而我编写了一个C程序来与具有制造商提供的C库的传感器连接。 现在我需要一种简单的方法在Windows机器上的这两个程序之间进行通信。 C程序将不断地将数据流传输到Python程序。 Python软件应该能够将命令发送到C软件以更改设置等。

到目前为止我发现的是:

  • 看起来非常有前途的ZeroMQ库,但我无法让它在Windows上运行,而且它似乎不再被保留了。
  • Python子进程模块,它能够管理被调用进程的stdin和stdout,但我似乎并没有像我想要的那样使它工作..

我现在编写的C代码只是一个虚拟程序,它输出输出字符串并打印给定的任何命令。问题是,来自C程序的数据不会连续地流到python程序的输出,而只是在我关闭程序时显示。此外,我无法将命令发送回c程序。

-Python Code:

import subprocess as subp

pro = subp.Popen("C:/Users/schoenhofer/Documents/Programming/Py2C/simpleIO/bin/Debug/simpleIO.exe",
                 stdin=subp.PIPE, stdout=subp.PIPE, bufsize=-1, universal_newlines=True)


while not pro.poll():
    ln = pro.stdout.read()

    if ln == '':
        pro.kill()
        break
    else:
        print(ln)

-C代码:

#include <stdlib.h>
#include <stdint.h>
#include <memory.h>
#include <windows.h>
#include <conio.h>
#include <time.h>

void delay(unsigned int mseconds)
{
    clock_t goal = mseconds + clock();
    while (goal > clock());
}

int main()
{
    TCHAR buf[20] = {0};
    DWORD dwLength, dwRead;
    DWORD got = 0;
    uint16_t i = 0;
    LPDWORD mode = 0;
    HANDLE h_in = GetStdHandle(STD_INPUT_HANDLE);

    if(h_in == INVALID_HANDLE_VALUE){
        printf("Error getting input handle\n");
        exit(EXIT_FAILURE);
    }

    dwLength = sizeof(buf);

    SetConsoleMode(h_in, ENABLE_PROCESSED_INPUT|ENABLE_LINE_INPUT|ENABLE_EXTENDED_FLAGS);
    while(1){

        if(kbhit()){
            if(ReadConsole(h_in, buf, dwLength, &got, NULL) == 0){
                DWORD err = GetLastError();
                printf("Error reading from console: %u", err);
                exit(EXIT_FAILURE);
            }
        }
        if(got > 0){
            printf("Got: %s", buf);
             memset(buf, 0, 20);
             got = 0;
        }
        else{
            printf("Got nothing\n");
        }
        delay(300);
    }

    return 0;
}

非常感谢任何帮助。 在此先感谢,托马斯

0 个答案:

没有答案