如何判断Python模块是在交互式Shell中加载还是被脚本/模块导入?
判断Python模块的导入场景:交互式Shell vs 脚本/其他模块
你可以通过检查__main__模块的属性和Python运行时标志,区分模块是从交互式Shell导入,还是从脚本或其他模块导入,以下是两种可靠的实现方式:
方法一:基于__main__模块与交互式标志
核心逻辑:交互式Shell的__main__模块无__file__属性(或属性值为特殊标识),且sys.flags.interactive会被设为True。
import sys def is_imported_from_interactive_shell(): main_module = sys.modules['__main__'] # 检查__main__是否来自非文件场景(交互式/命令行代码段) if not hasattr(main_module, '__file__'): return True # 处理python -c/-等特殊命令行执行的情况,结合交互式标志判断 if main_module.__file__ in ('-c', '-'): return sys.flags.interactive return False
方法二:结合终端输入检测
如果需要严格区分终端交互式场景,可以结合sys.stdin.isatty()判断输入是否来自终端:
import sys def is_interactive_import(): # 先确认输入来自终端 if not sys.stdin.isatty(): return False main_module = sys.modules['__main__'] # 再判断__main__是否为非文件加载的交互式模块 return not hasattr(main_module, '__file__') or sys.flags.interactive
模块中的使用示例
在你的模块中调用上述函数,即可执行不同逻辑:
# 你的模块代码 if is_imported_from_interactive_shell(): # 交互式场景逻辑:比如保留所有MIDI端口 pass else: # 脚本/模块导入场景逻辑:关闭指定MIDI端口 pass
注意事项
- 大部分标准Python环境(CPython、IPython)都适用,Jupyter Notebook会被识别为交互式场景,通常符合需求;
python -i script.py这种先运行脚本再进入交互的模式会被判定为交互式场景,若需区分可额外检查脚本执行痕迹。
内容的提问来源于stack exchange,提问作者user12421304
相关产品推荐
相关产品推荐

