2010-03-01 2 views
37

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

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

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

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

ответ

51

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

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

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

+0

Это работает, спасибо ... –

+4

Это так же, например, в исполняемых файлах py2exe. – fmark

+4

+1: Единственное, что я нашел, что работает с iPython –

16

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

+0

Также работает. Благодарю. –

+2

Не работает в IPython. –

+0

@ Keith, похоже, отлично работает для меня в iPython 3.2.1 REPL с использованием python 2.7.9 – hobs

6

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

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

+0

Это тоже работает. Угадайте, есть много способов сделать это :) –

+1

Uh oh. Прямое нарушение Zen Python, тогда :) –

+0

Хех ... Хотя я думаю, что версия @ echoback - единственная очевидная (иш). Я не принимал это просто потому, что в C и др., теоретически возможно, что 'argv [0]' является 'NULL' или пустой строкой, и я действительно не чувствую, что отлаживаю любые возможные ошибки, вызванные этим ... –

-4

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

6

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

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

Это проверяет только аргумент командной строки 'python -i' и не проверяет, находится ли в интерактивном режиме Python, набрав' python 'один. –

+0

Работает только в python 2.6+ –

+0

'bool (getattr (sys, 'ps1', sys.flags.interactive))' –

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' 
+1

'if sys.ps1: interpreter = True' =>' interpreter = sys.ps1' или 'interpreter = bool (sys.ps1) '. –

+0

@CristianCiupitu: Возможно, вы захотите проверить свой код, прежде чем публиковать его. Даже если это был действительный Python, он выкинул бы исключение AttribeError при запуске из командной строки. – jdines

+0

Я рекомендовал удалить инструкцию 'try ... except'? Я только рекомендовал заменить «if» простым назначением. –