Как получить python script для вызова "python -i" при вызове нормально?
У меня есть python script, который мне нравится запускать с python -i script.py
, который запускает script, а затем переходит в интерактивный режим, чтобы я мог играть с результатами.
Возможно ли, чтобы сам script вызывал эту опцию, так что я могу просто запустить python script.py
, а script войдет в интерактивный режим после запуска?
Конечно, я могу просто добавить -i
, или если это слишком много, я могу написать оболочку script, чтобы вызвать это.
Ответы
Ответ 1
Из script.py
установите переменную среды PYTHONINSPECT
в любую непустую строку. Python перепроверяет эту переменную среды в конце программы и вводит интерактивный режим.
import os
# This can be placed at top or bottom of the script, unlike code.interact
os.environ['PYTHONINSPECT'] = 'TRUE'
Ответ 2
В дополнение ко всем приведенным выше ответам вы можете запустить script как просто ./script.py
, выполнив исполняемый файл и установив строку shebang, например
#!/usr/bin/python -i
this = "A really boring program"
Если вы хотите использовать это с помощью команды env
, чтобы получить системный по умолчанию python
, вы можете попробовать использовать shebang, например @donkopotamus. предлагается в комментариях
#!/usr/bin/env PYTHONINSPECT=1 python
Успех этого может зависеть от версии env
, установленной на вашей платформе.
Ответ 3
Вы можете использовать экземпляр code.InteractiveConsole
, чтобы заставить это работать:
from code import InteractiveConsole
i = 20
d = 30
InteractiveConsole(locals=locals()).interact()
запуск этого с помощью python script.py
запустит интерактивный интерпретатор в качестве окончательного оператора и сделает видимым локальное имя через locals=locals()
.
>>> i
20
Аналогичным образом можно использовать функцию удобства code.interact
:
from code import interact
i = 20
d = 30
interact(local=locals())
Это создает для вас экземпляр с единственным оговоркой, что locals
вместо этого называется local
.
В дополнение к этому, как @Blender, указанному в комментариях, вы также можете вставить IPython
REPL, используя:
import IPython
IPython.embed()
который имеет дополнительное преимущество, не требуя пространства имен, которое было заполнено в вашем script, которое будет передано с помощью locals
.
Ответ 4
Я думаю, что вы ищете this?
import code
foo = 'bar'
print foo
code.interact(local=locals())
Ответ 5
Я просто сопроводил script оболочкой script, которая его вызывает.
exec python -i "$(dirname "$0")/script.py"