判断 Python 是不是处于交互模式

Posted

技术标签:

【中文标题】判断 Python 是不是处于交互模式【英文标题】:Tell if Python is in interactive mode判断 Python 是否处于交互模式 【发布时间】:2011-01-22 07:40:43 【问题描述】:

在 Python 脚本中,有没有办法判断解释器是否处于交互模式?这很有用,例如,当您运行交互式 Python 会话并导入模块时,会执行稍微不同的代码(例如,关闭日志记录)。

我查看了tell whether python is in -i mode 并尝试了那里的代码,但是,该函数仅在使用 -i 标志调用 Python 时返回 true,而不是在用于调用交互模式的命令为 python 且没有论据。

我的意思是这样的:

if __name__=="__main__":
    #do stuff
elif __pythonIsInteractive__:
    #do other stuff
else:
    exit()

【问题讨论】:

考虑使用logging 模块登录库,以便用户可以通过共享配置对其进行控制。 【参考方案1】:

__main__.__file__ 在交互式解释器中不存在:

import __main__ as main
print hasattr(main, '__file__')

这也适用于通过python -c 运行的代码,但不适用于python -m

【讨论】:

这也是在例如 py2exe 可执行文件中的情况。 不幸的是,这在嵌入式外壳中不起作用。 IE。以 IPython.embed() 开头的 shell bool(getattr(sys, 'ps1', sys.flags.interactive)), py2.6+ 到目前为止,似乎没有一个解决方案能够检测到PYTHONSTARTUP=script.py python3。表达式'readline' in sys.modules 可以,以及python3 -i script.pypython3 -ic 'import script'(在Ubuntu 焦点上使用Python 3.8.2 测试),但它非常不便携。 这是唯一适用于通过python -m ptpython 启动的ptpython 交互式会话的答案。【参考方案2】:

sys.ps1sys.ps2 仅在交互模式下定义。

【讨论】:

@Keith 在 iPython 3.2.1 REPL 中使用 python 2.7.9 对我来说似乎工作正常 同意,我刚刚签入 4.0,它也可以在那里工作。旧版本的 IPython 可能存在问题。 在我看来 sys.ps1sys.ps2 即使在 iPython not 以交互模式运行时也已定义。【参考方案3】:

我比较了我找到的所有方法并制作了一个结果表。最好的似乎是这样的:

hasattr(sys, 'ps1')

如果有人有其他可能不同的场景,请发表评论,我会添加它

【讨论】:

嘿,感谢您的辛勤工作,您能检查一下 Windows、Linux 和 Mac 吗?【参考方案4】:

使用sys.flags:

if sys.flags.interactive:
    #interactive
else:
    #not interactive 

【讨论】:

这仅检查命令行参数python -i,而不是通过单独输入python来测试是否处于Python交互模式。 bool(getattr(sys, 'ps1', sys.flags.interactive))【参考方案5】:

来自TFM:如果没有给出接口选项,则隐含-i,sys.argv[0]是一个空字符串(“”)并且当前目录将被添加到sys.path的开头。

如果用户使用python 调用解释器并且没有参数,正如您所提到的,您可以使用if sys.argv[0] == '' 进行测试。如果以 python -i 开头,这也会返回 true,但根据文档,它们在功能上是相同的。

【讨论】:

哦哦。直接违背Python之禅,那就:) 嘿...虽然我认为@echoback 的版本是唯一明显的(ish)版本。我没有接受这一点,仅仅是因为在 C 等语言中,理论上 argv[0] 可能是 NULL 或空字符串,我真的不想调试由此引起的任何潜在错误......跨度> 这可能会给其他解释器带来问题。例如,使用 IPython 时,sys.argv = ['/usr/bin/ipython']【参考方案6】:

以下内容在有和没有 -i 开关的情况下都有效:

#!/usr/bin/python
import sys
# Set the interpreter bool
try:
    if sys.ps1: interpreter = True
except AttributeError:
    interpreter = False
    if sys.flags.interactive: interpreter = True

# Use the interpreter bool
if interpreter: print 'We are in the Interpreter'
else: print 'We are running from the command line'

【讨论】:

if sys.ps1: interpreter = True => interpreter = sys.ps1interpreter = bool(sys.ps1) @CristianCiupitu:您可能希望在发布代码之前对其进行实际测试。即使它是有效的 Python,它也会在从命令行运行时抛出 AttribeError 异常。 我是否建议删除 try ... except 语句?我只建议用简单的分配替换if 我不喜欢椭圆,但我不明白 27 个字符是如何比 30 长的,或者当 if 还需要布尔值 sys.ps1 时,为什么计算密集度更高。 死灵!:bool(getattr(sys, 'ps1', sys.flags.interactive))【参考方案7】:

这是可行的。将以下代码 sn -p 放入一个文件中,并将该文件的路径分配给PYTHONSTARTUP 环境变量。

__pythonIsInteractive__ = None

然后你就可以使用了

if __name__=="__main__":
    #do stuff
elif '__pythonIsInteractive__' in globals():
    #do other stuff
else:
    exit()

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

【讨论】:

以上是关于判断 Python 是不是处于交互模式的主要内容,如果未能解决你的问题,请参考以下文章

是否有可能在交互模式下执行 Python 脚本

如何判断android的activity是不是运行

无法创建反应本机应用程序。需要输入,但 expo 处于非交互模式

python-FIrst1--变量赋值-注释-用户交互-条件判断与缩进

python import 以交互方式工作,但不是来自脚本

Python的判断,循环,用户交互.