使用自动加载导入的方式运行Python命令行解释器

26
我想在Python解释器中进行调试,但需要导入一些模块和完成对象初始化。目前,我每次都要在命令行上启动解释器并进行设置工作。是否有任何方法可以启动已完成所有初始化工作的命令行解释器?
例如:
# Done automatically.
import foo
import baz
l = [1,2,3,4]
# Launch the interpreter.
launch_interpreter()
>> print l
>> [1,2,3,4]
5个回答

48

你可以创建一个包含你想要自动运行的代码的脚本,然后使用python -i来运行它。例如,创建一个脚本(我们称之为script.py)包含以下内容:

import foo
import baz
l = [1,2,3,4]

然后运行脚本

$ python -i script.py
>>> print l
[1, 2, 3, 4]

在脚本运行完成后,Python 会把脚本的结果保留在交互式会话中。

如果您希望每次运行 Python 时都执行某些操作,可以将环境变量 PYTHONSTARTUP 设置为一个脚本,该脚本将在启动 Python 时运行。请参阅有关交互式启动文件的文档。


1
交互式启动文件的文档现在在这里:https://docs.python.org/3/tutorial/appendix.html#the-interactive-startup-file - Chris Clark
1
不需要特殊文件。 python -i -c“import sys; import mymodule; a=5” 选项-c允许您指定内联代码。选项-i保持交互模式。 - ddotsenko

9

5

当我尝试为我的研究配置新的desk时,我遇到了这个问题,并发现上面的答案并不完全符合我的需求:将整个桌面配置包含在一个文件中(这意味着我不会像@srgerg建议的那样创建单独的script.py)。

以下是我最终实现目标的方法:

export PYTHONPATH=$READ_GEN_PATH:$PYTHONPATH

alias prepy="python3 -i -c \"
from naive_short_read_gen import ReadGen
from neblue import neblue\""

在这种情况下,neblue 在当前工作目录中(因此不需要路径扩展名),而 naive_short_read_gen 在我的系统上的任意目录中,该目录通过 $READ_GEN_PATH 指定。
如果需要,您可以在单行中执行此操作:alias prepy=PYTHONPATH=$EXTRA_PATH:$PYTHONPATH python3 -i -c ...

0

在启动命令行时,您可以使用 -s 选项。详细信息请参阅文档此处


这是针对IDLE的,而不是普通控制台会话,对吗? - DNA

0

我觉得我知道你想要做什么。你可能想要检查一下IPython,因为你不能直接启动Python解释器而不给出-i选项。 这是我在我的项目中所做的:

def ipShell():
    '''Starts the interactive IPython shell'''
    import IPython
    from IPython.config.loader import Config
    cfg = Config()
    cfg.TerminalInteractiveShell.confirm_exit = False
    IPython.embed(config=cfg, display_banner=False)
# Then add the following line to start the shell
ipShell()

你需要小心,因为shell将具有定义函数ipShell()的模块的命名空间。如果您将定义放在运行的文件中,则可以访问所需的globals()。可能会有其他解决方法来注入所需的命名空间,但在那种情况下,您将不得不向函数传递参数。

编辑

下面的函数默认使用调用者的命名空间(__main__.__dict__)。

def ipShell():
    '''Starts the interactive IPython shell
    with the namespace __main__.__dict__'''
    import IPython
    from __main__ import __dict__ as ns
    from IPython.config.loader import Config
    cfg = Config()
    cfg.TerminalInteractiveShell.confirm_exit = False
    IPython.embed(config=cfg, user_ns=ns, display_banner=False)

没有任何额外的参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接