Popen.communicate\stdin.write stuck
Popen.communicate\stdin.write stuck
我使用的是 python 版本 2.7.9,当我尝试从 Popen 进程中读取一行时,它会一直卡住,直到进程结束。我怎样才能在标准输入结束前读取它?
如果输入是“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()
如果您将 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()
这是正在发生的事情:
- python 运行子进程
- 子进程写入"Enter the password:\n"
- python 读取行 "Enter the password:" 并且不对其进行任何操作
- python 将“123”写入子进程
- 子进程读取 123
- 子进程将检查 123 是否为 8200,这是错误的,将以 "Nope!"
回答
- "Nope!" 被 python 读取并用最后一行代码打印到标准输出
我使用的是 python 版本 2.7.9,当我尝试从 Popen 进程中读取一行时,它会一直卡住,直到进程结束。我怎样才能在标准输入结束前读取它?
如果输入是“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()
如果您将 printf 更改为
printf("Enter the password:\n");
并添加同花顺
fflush (stdout);
缓冲区已刷新。刷新意味着即使缓冲区尚未满也写入数据。我们需要添加一个 \n 来强制换行,因为 python 将缓冲所有输入,直到它在
中读取一个 \nproc.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()
这是正在发生的事情:
- python 运行子进程
- 子进程写入"Enter the password:\n"
- python 读取行 "Enter the password:" 并且不对其进行任何操作
- python 将“123”写入子进程
- 子进程读取 123
- 子进程将检查 123 是否为 8200,这是错误的,将以 "Nope!" 回答
- "Nope!" 被 python 读取并用最后一行代码打印到标准输出