关于Subprocess stdin ,stdout的多次输入,输出。
有一个猜数程序:import random
num = random.randint(1, 100)
count = 0
while True:
ans = int(input("Please input a number between 1 and 100:"))
count += 1
if ans == num:
print(f"The number is {ans}!")
break
elif ans > num:
print("Too Large!")
continue
else:
print("Too Small!")
continue
现在使用subprocess模块,运行该程序进行自动猜数。
import subprocess
import shlex
process = subprocess.Popen(shlex.split('python ask.py'), stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
process.stdin.write(b"50")
process.stdin.close()
print(process.stdout.read().decode())
如何才能多次进行猜想,并输出结果呢?,使用stdin.write()和stdout.read(),好像只能进行一次输出输出过程。在没有进行stdin.close(),没法进行stdout.read(),就没法多次输出猜想过程。
我在网上找的了stdout.read1()方法可以输出当前stdout结果,写出下面程序可以自动猜想,但是stdout.read1()好像不是subprocess的方法,在Pycharm里面会有黄色警告。
import subprocess
import shlex
low = 1
high = 100
mid = (low + high) // 2
process = subprocess.Popen(shlex.split('python ask.py'), stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
print(process.stdout.read1().decode())
process.stdin.write(f'{mid}\n'.encode())
print(f"{mid}")
process.stdin.flush()
while True:
hint = process.stdout.read1().decode()
print(hint)
if "Too Small" in hint:
low = mid + 1
mid = (low + high) // 2
elif "Too Large" in hint:
high = mid - 1
mid = (low + high) // 2
else:
print(process.stdout.read1().decode())
break
process.stdin.write(f'{mid}\n'.encode())
print(process.stdout.read1().decode())
process.stdin.flush()
print(f"{mid}") 问题的关键在于`process.stdout.read()`是一个阻塞的操作,只有当子进程的输出缓冲区中有数据时才会返回。所以在你的代码中,第一次读取输出后,如果没有再次写入数据,程序会一直阻塞在读取stdout的操作,导致后续的猜数和输出无法进行。
解决这个问题的方法是使用`process.stdout.readline()`来逐行读取输出,而不是一次性读取所有的输出。这样可以确保在每次写入数据后,都能够及时读取并处理相应的输出。
以下是修改后的示例代码:
import subprocess
import shlex
low = 1
high = 100
mid = (low + high) // 2
process = subprocess.Popen(shlex.split('python ask.py'), stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while True:
print(process.stdout.readline().decode())
process.stdin.write(f'{mid}\n'.encode())
process.stdin.flush()
hint = process.stdout.readline().decode()
print(hint)
if "Too Small" in hint:
low = mid + 1
mid = (low + high) // 2
elif "Too Large" in hint:
high = mid - 1
mid = (low + high) // 2
else:
print(process.stdout.readline().decode())
break
print(process.stdout.readline().decode())
process.stdin.write(f'{mid}\n'.encode())
process.stdin.flush()
通过使用`process.stdout.readline()`来逐行读取输出,可以保证在每次写入数据后都能及时读取输出,实现多次猜数和输出的过程。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。 在使用Python的subprocess模块进行多次输入和输出时,可以通过不断循环调用stdin.write()和stdout.readline()来实现。下面是一个例子:
import subprocess
import shlex
process = subprocess.Popen(shlex.split('python ask.py'), stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(process.stdout.readline().decode())# 读取第一行输出
while True:
guess = int(input("Please input a number:"))
process.stdin.write(f"{guess}\n".encode())# 将猜测的数字写入stdin
process.stdin.flush()# 刷新stdin缓冲区
output = process.stdout.readline().decode()# 读取输出结果
print(output)
if "The number is" in output:
break
process.stdin.close()
process.stdout.close()
process.stderr.close()
在这个例子中,我们首先读取了程序的初始输出,然后进入一个循环,不断从用户输入获取猜测的数字,并将其写入stdin,然后读取程序的输出结果。当程序输出包含"The number is"时,循环结束。
希望这个例子对你有所帮助。如果你还有其他问题,请随时提问。
回复来自于CHAT-GPT。回复仅供参考,如有人工回答,最佳答案请优先选择人工 Mike_python小 发表于 2023-11-24 15:26
在使用Python的subprocess模块进行多次输入和输出时,可以通过不断循环调用stdin.write()和stdout.readline ...
答案不对,没有输出结果,程序都不会停止{:5_104:}
6 强烈建议问问GPT https://chat18.aichatos.xyz/ 币 GPT!!! {:10_279:}{:10_279:}{:10_279:}论坛有GPT
页:
[1]