- 主题:py里调用命令行终端程序交互会阻塞,咋办
import subprocess
# 启动子进程
process = subprocess.Popen(['cmd'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while True:
output = process.stdout.readline() # 读取子进程的输出并解码为字符串
if output == '' and process.poll() is not None: # 如果子进程已经结束并且没有输出
break
if output: # 如果子进程有输出
print(output.strip()) # 输出子进程的输出
实际运行后,循环process.stdout.readline()读入多行后,一直读到空就阻塞了
也就是说卡在output = process.stdout.readline(),
if output == '' and process.poll() is not None:起不到作用
咋办
--
修改:ZHMZFFL FROM 101.24.89.*
FROM 101.24.89.*
cmd没退出,一直在等stdin,需要把stdin关掉
【 在 ZHMZFFL 的大作中提到: 】
: import subprocess
: # 启动子进程
: process = subprocess.Popen(['cmd'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
: ...................
--
FROM 114.251.196.*
关掉?.close()是吗
需要往终端里输送信息时候还能打开吗
【 在 CKevin 的大作中提到: 】
: cmd没退出,一直在等stdin,需要把stdin关掉
:
--
FROM 101.24.89.*
# 关闭标准输入流
process.stdin.close()
# 向子进程发送输入信息
output, error = process.communicate(input='dir\nexit\n'.encode('gbk'))
# 输出子进程的输出和错误信息
print(output.decode('gbk'))
print(error.decode('gbk'))
问了下gpt,告诉我这么弄
【 在 CKevin 的大作中提到: 】
: cmd没退出,一直在等stdin,需要把stdin关掉
:
--
FROM 101.24.89.*
我见过一种做法是用select/epoll去“试试”subprocess的stdout和stderr
试的时候带上超时限制
不过需要提醒的是:
当心那个持续慢启动、晚输出
【 在 ZHMZFFL 的大作中提到: 】
: import subprocess
: # 启动子进程
: process = subprocess.Popen(['cmd'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
: ...................
--
修改:JulyClyde FROM 139.226.19.*
FROM 139.226.19.*
赞,好用
目前还是人工专家比GPT精准
【 在 ToSimplicity 的大作中提到: 】
: 看了你的另一个帖子,我猜想你其实是搞个能不断问题,不断得到答案的功能吧。
: 这个叫master-slave模式
: 运行这个主脚本
: ...................
--
FROM 101.24.89.*
知道方向好啊,按我的提问,一直是收敛到asyncio
【 在 ToSimplicity 的大作中提到: 】
: 呃,代码的大部分都是chatgpt写的,这个还是要承认的
--
FROM 101.24.89.*