Подтвердить что ты не робот

Как получить python script для вызова "python -i" при вызове нормально?

У меня есть python script, который мне нравится запускать с python -i script.py, который запускает script, а затем переходит в интерактивный режим, чтобы я мог играть с результатами.

Возможно ли, чтобы сам script вызывал эту опцию, так что я могу просто запустить python script.py, а script войдет в интерактивный режим после запуска?

Конечно, я могу просто добавить -i, или если это слишком много, я могу написать оболочку script, чтобы вызвать это.

4b9b3361

Ответ 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"