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

How to get a python script to invoke "python -i" when called normally?

我有一个 python 脚本,我喜欢 运行 和 python -i script.py,其中 运行 脚本然后进入交互模式,这样我就可以玩了结果。

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

当然,我可以简单地添加 -i,或者如果这太费力,我可以编写一个 shell 脚本来调用它。

我想你在找 this?

import code
foo = 'bar'
print foo
code.interact(local=locals())

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

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

您可以使用 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.

传递脚本中填充的命名空间

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

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

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

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

此操作是否成功可能取决于您平台上安装的 env 版本。

我会简单地将脚本与调用它的 shell 脚本一起使用。

exec python -i "$(dirname "[=10=]")/script.py"