Скажите, если Python находится в интерактивном режиме - PullRequest
41 голосов
/ 01 марта 2010

В скрипте Python есть ли способ узнать, находится ли переводчик в интерактивном режиме? Это было бы полезно, например, когда вы запускаете интерактивный сеанс Python и импортируете модуль, выполняется немного другой код (например, ведение журнала отключено).

Я посмотрел на скажите, находится ли python в режиме -i , и попробовал там код, однако, эта функция возвращает true только если Python был вызван с флагом -i, а не когда используется для вызова интерактивного режима python без аргументов.

Я имею в виду что-то вроде этого:

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

Ответы [ 6 ]

55 голосов
/ 01 марта 2010

__main__.__file__ не существует в интерактивном переводчике:

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

Это также относится к коду, выполняемому через python -c, но не python -m.

20 голосов
/ 01 марта 2010

sys.ps1 и sys.ps2 определены только в интерактивном режиме.

6 голосов
/ 01 марта 2010

С TFM : Если опция интерфейса не указана, подразумевается -i, sys.argv [0] - пустая строка (""), и текущий каталог будет добавлен в начало sys. .path.

Если пользователь вызвал интерпретатор с python и без аргументов, как вы упомянули, вы можете проверить это с if sys.argv[0] == ''. Это также возвращает true, если началось с python -i, но согласно документам они функционально одинаковы.

5 голосов
/ 30 июля 2011

Использование sys.flags:

if sys.flags.interactive:
    #interactive
else:
    #not interactive 
1 голос
/ 13 июля 2014

Следующее работает как с ключом -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'
0 голосов
/ 07 июля 2011

Вот кое-что, что будет работать. Поместите следующий фрагмент кода в файл и назначьте путь к этому файлу для переменной среды 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

...