Popen.communicate \ stdin.write卡住了

时间:2015-04-22 15:22:57

标签: communicate

我正在使用python版本2.7.9,当我尝试从Popen进程中读取一行时,它会一直停留,直到进程结束。如何在stdin结束之前读取它?

如果输入是' 8200' (正确的密码)然后它打印输出。 但是,如果密码是从' 8200'所以没有输出,为什么?

子进程源代码:

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

int main(void)
{
    char password[10];
    int num;
    do
    {
        printf("Enter the password:");
        scanf("%s", &password);

        num = atoi(password);

        if (num == 8200)
            printf("Yes!\n");
        else
            printf("Nope!\n");
    } while (num != 8200);

    return 0;
}

Python源代码:

from subprocess import Popen, PIPE

proc = Popen("Project2", shell=True, stdin=PIPE,stdout=PIPE,stderr=PIPE)
#stdout_data = proc.communicate(input='8200\r\n')[0]
proc.stdin.write('123\r\n')
print proc.stdout.readline()

1 个答案:

答案 0 :(得分:0)

如果您将printf更改为

printf("Enter the password:\n");

并添加一个刷新

fflush (stdout);

刷新缓冲区。刷新意味着即使缓冲区尚未满,也会写入数据。我们需要添加\ n来强制换行,因为python会缓冲所有输入,直到它在

中读取\ n
proc.stdout.readline();
在python中我们添加了一条readline。它看起来像这样:

proc = Popen("Project2", shell=True, stdin=PIPE,stdout=PIPE,stderr=PIPE)
proc.stdout.readline()
proc.stdin.write('123\r\n')
print proc.stdout.readline()

这就是发生的事情:

  1. python运行子流程
  2. subprocess write&#34;输入密码:\ n&#34;
  3. python读取该行&#34;输入密码:&#34;并没有做任何事
  4. python写道&#34; 123&#34;到子流程
  5. 子流程读取123
  6. 子流程将检查123是否为8200,这是假的,并将以#34; Nope回答!&#34;
  7. &#34;!都能跟得上&#34;由python读取并使用最后一行代码
  8. 打印到stdout