Как заставить скрипт python вызывать python -i при обычном вызове?

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

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

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


person Matthew Moisen    schedule 25.08.2016    source источник
comment
Незапрошенное объявление о государственной службе: если вы используете python -i и любите завершение табуляции, вы должны сами проверить iPython (Фанат, без принадлежности.)   -  person JS.    schedule 26.08.2016
comment
Я обычно использую import IPython; IPython.embed(), если хочу поэкспериментировать с состоянием моего приложения. Возможно, вы сочтете это полезным.   -  person Blender    schedule 26.08.2016
comment
@Blender, почему бы не добавить это к ответам? Кроме того, OP Я считаю, что редактирование не нужно, если пользователь увидит этот вопрос, он прокрутит вниз, чтобы увидеть ответы.   -  person Dimitris Fasarakis Hilliard    schedule 26.08.2016
comment
@Jim: Это не сильно отличается от code.interact(local=locals()), просто интерпретатор красивее. Вам все равно нужно добавить код в конец вашего скрипта, чтобы встроить его.   -  person Blender    schedule 26.08.2016
comment
@Blender достаточно честно, я добавлю его в качестве дополнения к моему ответу, чтобы он был в более заметном месте.   -  person Dimitris Fasarakis Hilliard    schedule 26.08.2016


Ответы (5)


Изнутри script.py установите для переменной среды PYTHONINSPECT любую непустую строку. Python повторно проверит эту переменную среды в конце программы и войдет в интерактивный режим.

import os
# This can be placed at top or bottom of the script, unlike code.interact
os.environ['PYTHONINSPECT'] = 'TRUE'  
person user2357112 supports Monica    schedule 25.08.2016

В дополнение ко всем приведенным выше ответам вы можете запустить скрипт как просто ./script.py, сделав файл исполняемым и установив строку shebang, например

#!/usr/bin/python -i
this = "A really boring program"

Если вы хотите использовать это с командой env, чтобы получить системное значение по умолчанию python, вы можете попробовать использовать shebang, например @donkopotamus предложено в комментариях

#!/usr/bin/env PYTHONINSPECT=1 python

Однако успех этого может зависеть от версии env, установленной на вашей платформе.

person porglezomp    schedule 26.08.2016
comment
Отлично! Вы бы знали, как заставить его работать с #!/usr/bin/env python -i? Я получаю /usr/bin/env: python -i: No such file or directory - person Matthew Moisen; 26.08.2016
comment
@MatthewMoisen Есть несколько специфичных для платформы способов сделать это красиво, а также несколько ужасных хаков, которые потенциально будут работать в большем количестве мест. Для получения полной информации см .: stackoverflow.com/questions/3306518/ - person porglezomp; 26.08.2016
comment
@donkopotamus в качестве комментариев в ответе, который я связал, упоминается, что, похоже, работает на некоторых платформах, но не на других. - person porglezomp; 26.08.2016

Вы можете использовать экземпляр 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()

который имеет дополнительное преимущество, заключающееся в том, что не требуется, чтобы пространство имен, которое было заполнено в вашем скрипте, передавалось с помощью locals.

person Dimitris Fasarakis Hilliard    schedule 25.08.2016


Я бы просто сопровождал сценарий сценарием оболочки, который его вызывает.

exec python -i "$(dirname "$0")/script.py"
person Random832    schedule 26.08.2016