暮雨朝云 发表于 2023-11-24 15:25:09

关于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}")

FishC_GPT 发表于 2023-11-24 15:25:59

问题的关键在于`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官方接口),如未能正确解答您的问题,请继续追问。

Mike_python小 发表于 2023-11-24 15:26:23

在使用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。回复仅供参考,如有人工回答,最佳答案请优先选择人工

暮雨朝云 发表于 2023-11-24 15:41:00

Mike_python小 发表于 2023-11-24 15:26
在使用Python的subprocess模块进行多次输入和输出时,可以通过不断循环调用stdin.write()和stdout.readline ...

答案不对,没有输出结果,程序都不会停止{:5_104:}

六翻了 发表于 2023-11-24 19:00:40

6

琅琊王朝 发表于 2023-11-24 21:13:47

强烈建议问问GPT

琅琊王朝 发表于 2023-11-24 21:14:18

https://chat18.aichatos.xyz/

liuhongrun2022 发表于 2023-11-24 21:33:00

kerln888 发表于 2023-11-25 09:54:58

GPT!!!

kerln888 发表于 2023-11-25 10:01:35

{:10_279:}{:10_279:}{:10_279:}论坛有GPT
页: [1]
查看完整版本: 关于Subprocess stdin ,stdout的多次输入,输出。