如何获取要调用的python脚本;python-i";通常什么时候打电话?

如何获取要调用的python脚本;python-i";通常什么时候打电话?,python,python-interactive,Python,Python Interactive,我有一个python脚本,我喜欢用python-iscript.py运行它,它运行脚本,然后进入交互模式,这样我就可以处理结果了 是否可以让脚本本身调用此选项,这样我就可以运行pythonscript.py,脚本运行后将进入交互模式 当然,我可以简单地添加-I,或者如果这太费劲,我可以编写一个shell脚本来调用它。我想你在找什么 导入代码 foo='bar' 印刷食品 code.interact(local=locals()) 从script.py中,将环境变量设置为任何非空字符串。Pytho

我有一个python脚本,我喜欢用
python-iscript.py
运行它,它运行脚本,然后进入交互模式,这样我就可以处理结果了

是否可以让脚本本身调用此选项,这样我就可以运行
pythonscript.py
,脚本运行后将进入交互模式


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

我想你在找什么

导入代码
foo='bar'
印刷食品
code.interact(local=locals())

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

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

您可以使用的实例来实现此功能:

from code import InteractiveConsole
i = 20
d = 30
InteractiveConsole(locals=locals()).interact()
使用
pythonscript.py
运行此命令将启动一个交互式解释器作为最终语句,并通过
locals=locals()
使定义的本地名称可见

类似地,可以使用名为的便利函数:

from code import interact
i = 20
d = 30
interact(local=locals())
这将为您创建一个实例,唯一需要注意的是
locals
被命名为
local


除此之外,如评论中所述,您还可以使用以下方法嵌入
IPython
REPL:

import IPython
IPython.embed()

这样做的另一个好处是,不需要使用
局部变量传递脚本中填充的名称空间

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

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

如果您想将其与
env
命令一起使用,以获得系统默认的
python
,那么您可以尝试使用注释中建议的shebang

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

这可能取决于您平台上安装的
env
版本。

我只需在脚本中附带一个调用它的shell脚本即可

exec python-i“$(dirname“$0”)/script.py”

未经请求的公共服务公告:如果您使用“python-i”并且喜欢制表符补全,那么您应该自己签出(Fan,无隶属关系)。我通常使用
import-IPython;如果我想处理应用程序的状态,请使用IPython.embed()
。你可能会发现它很有用。@Blender为什么不把它添加到答案中呢?另外,我认为编辑是不必要的,如果用户看到这个问题,他会向下滚动查看答案。@Jim:这与
code.interact(local=locals())
没有太大区别,解释器更漂亮。您仍然需要在脚本末尾添加代码以嵌入它。@Blender很公平,我将添加它作为我答案的补充,以便将其放在更显眼的位置。这太棒了!您知道如何使用
#/usr/bin/env python-i
?我得到了一个
/usr/bin/env:python-I:没有这样的文件或目录
@MatthewMoisen有一些特定于平台的方法可以很好地完成它,还有一些可怕的黑客可能会在更多地方工作。有关详细信息,请参见:
#/usr/bin/env PYTHONINSPECT=1 python
@donkopotamus正如我链接的答案中提到的,这似乎在某些平台上有效,但在其他平台上无效。