【问题标题】:What code can I use to check if script is running in IDLE?我可以使用什么代码来检查脚本是否在 IDLE 中运行?
【发布时间】:2021-12-15 18:09:31
【问题描述】:

正如标题所说。我想编写一个行为不同的脚本,具体取决于它是在控制台窗口内还是在 IDLE 中运行。是否存在仅在我可以检查的 IDLE 中运行时才存在的对象?环境变量?

我在 Windows 上使用 Python 2.6.5 和 2.7。

编辑:

到目前为止给出的答案是有效的。但我正在寻找一种正式的方式来做到这一点,或者看起来不像黑客的方式。如果有人想出一个,我会接受它作为答案。否则,过几天,我会接受最早的答复。

【问题讨论】:

    标签: python python-2.7 python-idle


    【解决方案1】:

    我更愿意这样做:

    import sys
    print('Running IDLE' if 'idlelib.run' in sys.modules else 'Out of IDLE')
    

    【讨论】:

    • 这不适用于 Python 2.7.2。尝试搜索“idlelib.__main__”
    • 它在 2.7.3 中工作,只需在 IDLE 命令行和 windowsXP 中的 CMD 中重新运行它,并在两者中运行脚本。
    • 如果将它保存为脚本并从右键单击上下文菜单在 IDLE 中打开它,则它不起作用。如果你先打开 IDLE 然后打开脚本,它可以工作。我建议的方法在这两种情况下都有效[这是 IDLE 的一个已知“功能”:在第一种情况下,它在同一进程中打开脚本和解释器]
    • 'idlelib.__main__' 在(至少)python3.6 中不起作用。只找'idlelib'似乎最靠谱。
    • @Dhara:您的方法在 Python 3.8.8 中不起作用(这个答案确实如此)。
    【解决方案2】:

    Google 找到了我 this 2003 年的论坛帖子。使用 Python 3.1(用于 win32)及其随附的 IDLE 版本,len(sys.modules) os 47 在命令行中,但在 IDLE shell 中为 122。

    但是你为什么还要关心呢? Tkinter 代码在使用 IDLE 运行时会有些烦恼(因为后者使用 tkinter 本身),但否则我认为我可以放心地假设您不必关心。

    【讨论】:

    • 嗯... sys.modules 是一个字典,有一些以“idlelib.”开头的键,所以我可以检查一下。但这听起来像一个黑客,所以我想避免它。它们甚至可以有不同的长度(2.6.5:149、2.7:152)。
    • 好吧,我想如果没有丑陋的黑客,这是不可能的。这就是为什么我问你为什么认为你需要......
    • 通过控制台,我希望能够清屏、移动光标、添加颜色、使用 msvcrt.getch 等。其中大多数似乎在 IDLE 中不起作用,还有一些甚至会默默地失败,所以与其让它发生,我宁愿让它检查它是否在 IDLE 中运行。
    • 好吧,我担心你在这里不走运。除非你想破解,否则就是这样。对不起。
    • 有人可能会关心,因为multiprocessing examples tend to run poorly in IDLE
    【解决方案3】:

    我建议将所有代码打包在一个函数中(Python 3):

    def RunningIntoPythonIDLE():
    
        import idlelib.PyShell
    
        def frames(frame = sys._getframe()):
            _frame = frame
            while _frame :
                yield _frame
                _frame = _frame.f_back
    
        return idlelib.PyShell.main.__code__ in [frame.f_code for frame in frames()]
    

    因此 tkinter 应用程序可以进行检查:

    if not RunningIntoPythonIDLE():
        root.mainloop()
    

    【讨论】:

      【解决方案4】:

      我有点晚了,但是由于 IDLE 用自定义对象 (and that is documented) 替换了标准流,因此可以检查这些以确定脚本是否在 IDLE 中运行:

      import sys
      
      def in_idle():
          try:
              return sys.stdin.__module__.startswith('idlelib')
          except AttributeError:
              return True
      

      【讨论】:

        【解决方案5】:

        我的建议是获取所有正在运行的帧的列表并检查主要 Idle 方法是否会在其中。

        def frames(frame = sys._getframe()):
            _frame = frame
            while _frame :
                yield _frame
                _frame = _frame.f_back
        import idlelib.PyShell
        print(idlelib.PyShell.main.func_code in [frame.f_code for frame in frames()])
        

        frames 函数在其声明的那一刻生成正在运行的帧,因此您可以检查此处是否空闲。

        【讨论】:

        • 它可以工作,但如果它不是用脚本打开的,那么它会返回 False。但是其中还有其他 idlelib 对象,例如 。 (用 2.6 试过)
        猜你喜欢
        • 2018-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多