Ответ 1
__main__.__file__
не существует в интерактивном интерпретаторе:
import __main__ as main
print hasattr(main, '__file__')
Это также относится к прогону кода через python -c
, но не python -m
.
В Python script есть ли способ определить, работает ли интерпретатор в интерактивном режиме? Это было бы полезно, например, когда вы запускаете интерактивный сеанс Python и импортируете модуль, выполняется несколько другой код (например, ведение журнала отключается).
Я посмотрел на сообщите, находится ли python в режиме -i, и попробовал там код, однако эта функция возвращает только true, если Python был вызван с помощью -i, а не когда команда, используемая для вызова интерактивного режима, python
без аргументов.
Что я имею в виду, это примерно так:
if __name__=="__main__":
#do stuff
elif __pythonIsInteractive__:
#do other stuff
else:
exit()
__main__.__file__
не существует в интерактивном интерпретаторе:
import __main__ as main
print hasattr(main, '__file__')
Это также относится к прогону кода через python -c
, но не python -m
.
sys.ps1
и sys.ps2
только определенных в интерактивном режиме.
Из TFM: Если не задана опция интерфейса, -i подразумевается, sys.argv [0] является пустой строкой ( "" ), и текущий каталог будет добавлен в начало sys.path.
Если пользователь вызвал интерпретатор с помощью python
и никаких аргументов, как вы упомянули, вы можете проверить это с помощью if sys.argv[0] == ''
. Это также возвращает true, если начато с python -i
, но, согласно документам, они функционально одинаковы.
Используйте sys.flags
:
if sys.flags.interactive:
#interactive
else:
#not interactive
Следующее работает как с ключом -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'
Вот что-то, что сработает. Поместите следующий фрагмент кода в файл и назначьте путь к этому файлу переменной среды 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