Oracle Linux 9下Python子脚本调用时input函数无法等待用户输入问题
问题
环境:Oracle Linux 9,Python 3.9
脚本功能:
- 从指定WHL文件集合为第二个脚本安装依赖
- 依赖安装完成后启动“动作”脚本(这部分运行正常)
启动第二个脚本的代码如下:
def spawn_config_script_and_die(program, exit_code=0): subprocess.Popen(program) sys.exit(exit_code) spawn_config_sript_and_die(['python3', 'confi_script.py', '-H', host_name, '-l', log_level, '-p', config_path])
遇到的问题:
从第一个脚本启动第二个脚本时,第二个脚本里的input()命令不等待用户输入,直接继续执行(如同用户只按了回车);但直接运行第二个脚本时,input()工作正常。尝试启动第二个脚本后立即退出第一个脚本,问题依旧。
解决方案
问题根源是subprocess.Popen默认未将子进程的标准输入、输出、错误流关联到当前交互终端。修改Popen调用,显式绑定流即可解决:
修改后的代码
import subprocess import sys def spawn_config_script_and_die(program, exit_code=0): subprocess.Popen(program, stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr) sys.exit(exit_code) spawn_config_sript_and_die(['python3', 'confi_script.py', '-H', host_name, '-l', log_level, '-p', config_path])
补充方案(更彻底的进程替换)
如果上述方法仍有异常,可以用os.execvp让子进程直接替换父进程,完全继承终端上下文:
import os import sys def spawn_config_script_and_die(program, exit_code=0): os.execvp(program[0], program) sys.exit(exit_code) spawn_config_sript_and_die(['python3', 'confi_script.py', '-H', host_name, '-l', log_level, '-p', config_path])
原因说明
默认调用Popen时,子进程的标准输入不会连接到用户当前的TTY终端,而是继承父进程的stdin流(父进程脚本的stdin通常非交互状态)。显式指定stdin=sys.stdin等参数后,子进程能直接使用终端的输入输出,input()就能正常等待用户输入了。
内容的提问来源于stack exchange,提问作者pythonic
相关产品推荐
相关产品推荐

