0

我正在使用 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()
4

1 回答 1

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. 子进程写入“输入密码:\n”
  3. python 读取“输入密码:”这一行,然后什么也不做
  4. python将“123”写入子进程
  5. 子进程读取 123
  6. 子进程将检查 123 是否为 8200,这是错误的,并会回答“不!”
  7. “没有!” 由python读取并使用最后一行代码打印到stdout
于 2015-04-22T15:26:22.273 回答