You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用subprocess后Python菜单循环无法接收输入的问题求助

解决subprocess调用后菜单无法响应输入的问题

问题根源

  1. 代码存在基础语法错误(缩进混乱、全局循环未正确终止、无效语句),导致逻辑执行异常。
  2. 调用subprocess时,子进程与父进程共享标准输入流,使得父进程的input()无法获取用户输入;subprocess.call虽会等待子进程结束,但如果子进程未正确释放输入资源,也会引发输入阻塞。

修复方案

1. 修正基础语法问题

  • 将#!/bin/bash移至文件最顶部(仅类Unix系统生效,Windows可忽略)。
  • 删除或补全无效的sys.path.append语句(若需添加路径,格式为sys.path.append("目标路径"))。
  • 统一代码缩进(Python对缩进严格要求)。
  • 选择退出选项时,设置menu = False终止循环。

2. 隔离subprocess输入流

  • 对subprocess.call:显式指定stdin=subprocess.PIPE,避免子进程占用父进程输入流。
  • 对subprocess.Popen:若需等待子进程结束再返回菜单,用communicate()方法;若允许子进程后台运行,仍需保留stdin=subprocess.PIPE隔离输入。

修正后的代码

#!/bin/bash
import sys
import time
import subprocess

# 如需添加模块路径,取消注释并填入实际路径
# sys.path.append("/your/target/path")

menu = True

def mainMenu():
    global menu
    while menu:
        print("""
        @@@@@@@@@@@@@@@@@@
        @ Utilities Menu @
        @@@@@@@@@@@@@@@@@@
    
    1. Tray Flasher
    2. ESP Burner
    3. Quit
        """)
        choice = input('Select a utility: ')
        if choice == '1':
            trayFlasher()
        elif choice == '2':
            espBurner()
        elif choice == '3':
            print('Goodbye!')
            menu = False

def trayFlasher():
    print('Have Fun!')
    time.sleep(1)
    # 隔离子进程输入流,避免阻塞父进程
    subprocess.call(["<path to file>"], stdin=subprocess.PIPE)

def espBurner():
    print('Burn Baby Burn...')
    time.sleep(1)
    # 创建子进程并等待其结束,同时隔离输入流
    proc = subprocess.Popen(['<path to file>'], stdin=subprocess.PIPE)
    proc.communicate()

额外说明

  • 若希望espBurner中的子进程后台运行(无需等待即可返回菜单),可删除proc.communicate(),但必须保留stdin=subprocess.PIPE防止输入冲突。
  • 请将<path to file>替换为实际可执行文件路径,Windows系统需注意转义反斜杠(如"C:\\tools\\burner.exe")。

内容的提问来源于stack exchange,提问作者BRZswanny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 17:25:26