Python 子进程Popen stdin将仅在脚本完成后输入并运行

Python 子进程Popen stdin将仅在脚本完成后输入并运行,python,windows,cmd,subprocess,stdin,Python,Windows,Cmd,Subprocess,Stdin,说明: 我试图制作一个可以在聊天软件上交互的shell,因此我需要一个cmd.exe作为子进程,并将字符串传递到进程中 我有这个: 从子流程导入Popen 从子流程导入管道作为p proc=Popen(“cmd”,stdout=p,stdin=p,shell=True) 因此,如果需要将输入传递给进程,通常我们会使用proc.stdin.write() 但是字符串似乎只有在python脚本完成后才能传入并工作 例如,我有 #上面也一样 进程stdin.write(“ping 127.0.0.1

说明:

我试图制作一个可以在聊天软件上交互的shell,因此我需要一个
cmd.exe
作为子进程,并将字符串传递到进程中

我有这个:

从子流程导入Popen
从子流程导入管道作为p
proc=Popen(“cmd”,stdout=p,stdin=p,shell=True)
因此,如果需要将输入传递给进程,通常我们会使用
proc.stdin.write()
但是字符串似乎只有在python脚本完成后才能传入并工作

例如,我有

#上面也一样
进程stdin.write(“ping 127.0.0.1.encode())
时间。睡眠(10)
脚本将等待10秒,然后通过并运行
ping
命令。 这意味着不可能得到结果
stdout.read()
,因为什么都没有

我曾尝试使用
subprocess.Popen.communicate()
,但它在一次输入后关闭管道


有没有办法解决“仅在脚本完成后运行命令”的问题,或者让
communicate()
不关闭管道?

对管道的写入被缓冲,您需要刷新缓冲区

proc.stdin.write("ping 127.0.0.1".encode())
proc.stdin.flush()

如果对管道的写入被缓冲,则需要刷新缓冲区

proc.stdin.write("ping 127.0.0.1".encode())
proc.stdin.flush()

是的,我确实传递了“\n”和命令以使它们运行。是的,我传递了“\n”和命令以使它们运行。您可以通过将
bufsize=0
传递到
Popen
来禁用Python端的缓冲。但是,不管您是使用手动刷新还是不使用缓冲,这种制作交互式shell的尝试通常注定要失败。它几乎只适用于CMD的内部命令和非交互式外部程序。大多数交互式外部程序将在其管道一侧使用完全缓冲。它们有时单独使用环境变量选项或命令行选项来禁用缓冲,但在Windows中使用管道进行标准I/O时,没有通用的方法来解决这一问题。您可以通过将
bufsize=0
传递到
Popen
来禁用Python端的缓冲。但是,不管您是使用手动刷新还是不使用缓冲,这种制作交互式shell的尝试通常注定要失败。它几乎只适用于CMD的内部命令和非交互式外部程序。大多数交互式外部程序将在其管道一侧使用完全缓冲。它们有时单独使用环境变量选项或命令行选项来禁用缓冲,但在Windows中使用管道进行标准I/O时,没有通用的方法来解决这一问题。