62

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

我已经查看了tell python是否处于-i模式并尝试了那里的代码,但是,该函数仅在使用-i标志调用Python时才返回true,而不是在用于调用交互模式的命令python没有参数时返回.

我的意思是这样的:

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

7 回答 7

70

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

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

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

于 2010-03-01T14:25:26.113 回答
27

sys.ps1并且sys.ps2仅在交互模式下定义。

于 2010-03-01T14:27:50.197 回答
26

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

hasattr(sys, 'ps1')

在此处输入图像描述

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

于 2020-10-25T12:38:23.203 回答
14

使用sys.flags

if sys.flags.interactive:
    #interactive
else:
    #not interactive 
于 2011-07-29T21:09:54.217 回答
7

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

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

于 2010-03-01T14:30:18.400 回答
1

以下在有和没有 -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'
于 2014-07-13T16:13:54.880 回答
-3

这是可行的。将以下代码段放入文件中,并将该文件的路径分配给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

于 2011-07-07T18:03:24.753 回答