我有一个我喜欢运行的 python 脚本python -i script.py
,它运行脚本然后进入交互模式,以便我可以玩弄结果。
是否可以让脚本本身调用此选项,这样我就可以运行python script.py
并且脚本在运行后将进入交互模式?
当然,我可以简单地添加-i
,或者如果这太费力,我可以编写一个 shell 脚本来调用它。
我有一个我喜欢运行的 python 脚本python -i script.py
,它运行脚本然后进入交互模式,以便我可以玩弄结果。
是否可以让脚本本身调用此选项,这样我就可以运行python script.py
并且脚本在运行后将进入交互模式?
当然,我可以简单地添加-i
,或者如果这太费力,我可以编写一个 shell 脚本来调用它。
从内部script.py
,将PYTHONINSPECT
环境变量设置为任何非空字符串。Python 会在程序结束时重新检查这个环境变量并进入交互模式。
import os
# This can be placed at top or bottom of the script, unlike code.interact
os.environ['PYTHONINSPECT'] = 'TRUE'
除了上述所有答案之外,您还可以./script.py
通过使文件可执行并设置 shebang 行来简单地运行脚本,例如
#!/usr/bin/python -i
this = "A really boring program"
如果您想将此命令与env
命令一起使用以获得系统默认值python
,那么您可以尝试使用评论中建议的@donkopotamus之类的 shebang
#!/usr/bin/env PYTHONINSPECT=1 python
但是,此操作的成功可能取决于env
您平台上安装的版本。
你可以使用一个实例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
.
我想你在找这个?
import code
foo = 'bar'
print foo
code.interact(local=locals())
我会简单地将脚本与调用它的 shell 脚本一起使用。
exec python -i "$(dirname "$0")/script.py"