在没有flush()和新行的子进程输出上进行非阻塞读取

问题描述 投票:1回答:1

我有一个我无法修改的程序。这个程序打印数据到stdout没有冲洗它或把\n放在里面等待输入等等。

我的问题是,我如何从Python脚本中实时打印stdout并写入他的stdin?我找到了一些方法来写他的stdin而不关闭程序,但问题仍然是打印他的stdout

事实上,线程,Popenfcntl有一些问题要实时打印他的输出,但他们都假设程序在每次打印后刷新stdout并在其输出中包含\n

要清楚,让我说我有一个程序test.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void)
{
    char name[100], age[100], location[100];
    fprintf (stdout, "\nWhat is your name : ");
    fgets (name, sizeof (name), stdin);
    name[strcspn (name, "\n")] = '\0';
    fprintf (stdout, "How old are you : ");
    fgets (age, sizeof (age), stdin);
    age[strcspn (age, "\n")] = '\0';
    fprintf (stdout, "Where do you live : ");
    fgets (location, sizeof (location), stdin);
    location[strcspn (location, "\n")] = '\0';
    fprintf (stdout, "\nHello %s, you have %s years old and live in 
             %s\n\n", name, age, location);
    return 0;
}

我怎样才能从Python脚本输出第一个fprintf(),然后将答案写入他的stdin,依此类推,就像我可以简单地启动test.c一样?

目的是控制从脚本发送到此程序的数据,并仍然返回发生的情况。

python subprocess stdout stdin nonblocking
1个回答
0
投票

您可以使用以下程序,该程序严重依赖于标准Python语言的subprocess包:

def run_program(cmd, sinput=''):
    """Run the command line and output (ret, sout, serr)."""
    import subprocess

    proc =  subprocess.Popen(cmd,
                             stdin=subprocess.PIPE,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE)
    sin = proc.stdin
    sout, serr = proc.communicate(sinput.encode("utf-8"))
    ret = proc.wait()

    return (ret, sout, serr)

因此,您刚用C编写的程序将提供以下内容:

cmd = ['myprogram']
sinput = 'myname\n6\nWhitechapel\n'
(ret, sout, serr) = run_program(cmd, sinput)

请注意,您无法避免使用\n字符,因为目标程序使用它来知道您发送问题的答案。

© www.soinside.com 2019 - 2024. All rights reserved.