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

如何判断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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:05:42