【问题标题】:Check python interactive mode in sitecustomize在 sitecustomize 中检查 python 交互模式
【发布时间】:2011-09-29 20:12:47
【问题描述】:

我有一条 MOTD 类型的消息,它会在调用解释器时打印出来。目前这是在 sitecustomize 中打印出来的。如果口译员未处于交互模式,我想禁止显示该消息;不幸的是,所有的检查 Tell if Python is in interactive mode 在 sitecustomize 中不起作用。 (sys.argvsys.ps1__main__.__file__ 未填充。)是否有在 sitecustomize 中有效的检查?

【问题讨论】:

    标签: python


    【解决方案1】:

    JAB 让我查看了代码,我最终想出了这个:

    import ctypes
    import getopt
    
    ctypes.pythonapi.Py_GetArgcArgv.restype = None
    ctypes.pythonapi.Py_GetArgcArgv.argtypes = [
        ctypes.POINTER(ctypes.c_int),
        ctypes.POINTER(ctypes.POINTER(ctypes.c_char_p))]
    count = ctypes.c_int()
    args = ctypes.pointer(ctypes.c_char_p())
    ctypes.pythonapi.Py_GetArgcArgv(ctypes.byref(count), ctypes.byref(args))
    argc = count.value
    argv = [args[i] for i in range(count.value)]
    if argc > 1:
        interactive = False
        opts, args = getopt.getopt(argv[1:], 'i')
        for o, a in opts:
            if o == '-i':
                interactive = True
    else:
        interactive = True
    

    有点难看(对于 Py3k,c_char_p 需要是 c_wchar_p),但可以。

    【讨论】:

    • 很高兴您能够找到一个按您希望的方式工作的解决方案。
    【解决方案2】:

    也许这种使用inspect 模块检查解释器交互性并检查堆栈帧的想法可能对您有用:

    http://mail.python.org/pipermail/pythonmac-sig/2002-February/005054.html

    您也可以尝试直接查看pydoc.help() 的源代码,上面链接的代码 sn-ps 的灵感来自该源代码。


    刚刚意识到您可以简单地使用包含带有PYTHONSTARTUP 环境变量的交互式提示的文件。 PYTHONSTARTUP指向的文件中的命令只有在解释器交互运行时才会执行。

    http://docs.python.org/tutorial/interpreter.html#the-interactive-startup-file

    如果您不想在 Python 之外设置环境变量,您可以将变量设置为 sitecustomize.py 中的所需文件,但是当我尝试查看它以找到加载顺序时,我花了直接回到我答案第一部分的链接。

    【讨论】:

    • 该代码不再在 pydoc 中(检查日期...),并且 sitecustomize 中的堆栈框架在交互和非交互模式之间没有区别。不过值得一试。
    • 突然意识到,对于您的情况,有一个非常简单的解决方案。再次查看我的答案。
    • 如果不踩用户的 PYTHONSTARTUP,我想不出一个好方法来处理这个问题,但它让我看到了那个代码......看看我的答案。
    【解决方案3】:

    检查 sys.flags 是一种更简洁的方法。

    >>> import sys  
    >>> sys.flags.interactive  
    1
    

    注意,IDLE 本质上也是交互式的,但未设置标志。我会在下面做:

    >>> if sys.flags.interactive or sys.modules.has_key('idlelib'):  
    >>>     pass # do stuff specific to interactive.
    

    【讨论】:

    • 这仅检查是否在命令行上指定了 -i...如果解释器是“裸”启动的,它仍然会处于交互模式。
    猜你喜欢
    • 2011-08-31
    • 2019-10-27
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 2021-02-20
    • 2015-11-01
    • 1970-01-01
    相关资源
    最近更新 更多