判断 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() 开头的 shellbool(getattr(sys, 'ps1', sys.flags.interactive))
, py2.6+
到目前为止,似乎没有一个解决方案能够检测到PYTHONSTARTUP=script.py python3
。表达式'readline' in sys.modules
可以,以及python3 -i script.py
和python3 -ic 'import script'
(在Ubuntu 焦点上使用Python 3.8.2 测试),但它非常不便携。
这是唯一适用于通过python -m ptpython
启动的ptpython
交互式会话的答案。【参考方案2】:
sys.ps1
和 sys.ps2
仅在交互模式下定义。
【讨论】:
@Keith 在 iPython 3.2.1 REPL 中使用 python 2.7.9 对我来说似乎工作正常 同意,我刚刚签入 4.0,它也可以在那里工作。旧版本的 IPython 可能存在问题。 在我看来sys.ps1
和 sys.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.ps1
或 interpreter = 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 是不是处于交互模式的主要内容,如果未能解决你的问题,请参考以下文章
无法创建反应本机应用程序。需要输入,但 expo 处于非交互模式