如何在正常调用时让python脚本调用"python -i"?

Mat*_*sen 19 python python-interactive

我有一个我喜欢运行的python脚本python -i script.py,它运行脚本然后进入交互模式,以便我可以使用结果.

是否可以让脚本本身调用此选项,以便我可以运行python script.py并且脚本在运行后将进入交互模式?

当然,我可以简单地添加-i,或者如果需要付出太多努力,我可以编写一个shell脚本来调用它.

use*_*ica 21

从内部script.py,将PYTHONINSPECT环境变量设置为任何非空字符串.Python将在程序结束时重新检查此环境变量并进入交互模式.

import os
# This can be placed at top or bottom of the script, unlike code.interact
os.environ['PYTHONINSPECT'] = 'TRUE'  
Run Code Online (Sandbox Code Playgroud)


por*_*omp 7

除了上述所有答案之外,您还可以./script.py通过使文件可执行并设置shebang行来运行脚本,例如

#!/usr/bin/python -i
this = "A really boring program"
Run Code Online (Sandbox Code Playgroud)

如果你想在env命令中使用它以获得系统默认值python,那么你可以尝试使用评论中建议的像@donkopotamus这样的shebang

#!/usr/bin/env PYTHONINSPECT=1 python
Run Code Online (Sandbox Code Playgroud)

这种成功可能取决于env您平台上安装的版本.


Jim*_*ard 6

您可以使用实例code.InteractiveConsole来实现此功能:

from code import InteractiveConsole
i = 20
d = 30
InteractiveConsole(locals=locals()).interact()
Run Code Online (Sandbox Code Playgroud)

运行此命令python script.py将启动交互式解释器作为最终语句,并通过定义本地名称locals=locals().

>>> i
20
Run Code Online (Sandbox Code Playgroud)

同样,code.interact可以使用名为的便捷函数:

from code import interact
i = 20
d = 30
interact(local=locals())
Run Code Online (Sandbox Code Playgroud)

这将为您创建实例,而唯一的警告locals就是命名local.


除此之外,正如@Blender在评论中所述,您还可以IPython使用以下内容嵌入REPL:

import IPython
IPython.embed()
Run Code Online (Sandbox Code Playgroud)

它的另一个好处是不需要传递脚本中已填充的命名空间locals.