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

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

说明:

[我试图制作一个可以在聊天软件上进行交互的外壳,所以我需要一个cmd.exe作为子进程,并将字符串传递给该进程。

我有这个:

from subprocess import Popen
from subprocess import PIPE as p

proc = Popen("cmd",stdout=p,stdin=p,shell=True)

因此通常,如果我们需要将输入传递给流程,我们会使用proc.stdin.write()但似乎只有在python脚本完成后,字符串才能传入并起作用]

例如,我有

#same thing above
proc.stdin.write("ping 127.0.0.1".encode())
time.sleep(10)

该脚本将等待10秒钟,然后传递并运行ping命令。这意味着不可能得到结果stdout.read(),因为什么都没有。

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

有什么方法可以解决“仅在脚本完成后运行命令”的问题,或者使communication()无法关闭管道?

python subprocess stdin
1个回答
2
投票

写入管道的内容已缓冲,您需要刷新缓冲区。

proc.stdin.write("ping 127.0.0.1".encode())
proc.stdin.flush()
© www.soinside.com 2019 - 2024. All rights reserved.