【问题标题】: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 模块登录库,以便用户可以通过共享配置对其进行控制。

标签: python interactive python-2.5 python-2.x


【解决方案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

【讨论】:

    猜你喜欢
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2014-11-13
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多