将 python 命令行参数发送到 IPython

Sending python command line arguments to IPython

我们如何启动 ipython REPL 并指示它向底层 python 解释器传递一些命令行参数?

例如,我们可以使用

打开一个更详细的 python REPL
python -v

但是我看不到如何在打开时通过该标志 IPython。

我认为最好的方法是使用 python:

显式启动 ipython
python /usr/bin/ipython

因为 ipython 可执行文件只是一个 python 脚本;或者您可以通过告诉 python 加载 ipython 库来启动 ipython

python -m IPython.frontend.terminal.ipapp

然后您可以添加所有本机 python 参数:

python -v /usr/bin/ipython
python -v -m IPython.frontend.terminal.ipapp

HTH

-v 选项会影响解释器本身的行为,而不仅仅是 REPL。无论是否添加 -i 选项,您都会获得额外的导入信息。

这是启动 ipython(或至少一个版本)

的默认脚本
1522:~/mypy$ cat /usr/local/bin/ipython3.5
#!/usr/local/bin/python3.5

# -*- coding: utf-8 -*-
import re
import sys

from IPython import start_ipython

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(start_ipython())

并在 ipython 会话中:

In [1153]: from IPython import start_ipython
In [1154]: start_ipython??
String form: <function start_ipython at 0xb697edac>
File:        /usr/lib/python3/dist-packages/IPython/__init__.py
Definition:  start_ipython(argv=None, **kwargs)
Source:
def start_ipython(argv=None, **kwargs):
   "..."
   from IPython.terminal.ipapp import launch_new_instance
    return launch_new_instance(argv=argv, **kwargs)

最终 argv 被传递给 argparse 解析器。 Ipython 使用从其配置文件派生的参数填充该解析器。所以你有几个选项来设置参数——默认配置、配置文件配置和命令行。但这一切都是在解释器启动之后。有些事情是在同一个解释器 REPL 中进行的,但不是全部(-m,但不是 -v)。

当 zmo 建议使用 -v 时,我们会看到所有 ipython 代码的导入 - 这是相当多的。您对这些感兴趣,还是对与您自己的脚本相关的导入更感兴趣?

我经常使用 ipython 来测试答案,尤其是 numpy。事实上,我的默认 ipython 调用具有 --pylab 标志。但是为了测试独立脚本,我使用普通 python(通常从我的编辑器中的终端 window 调用)。有时我会 %run 来自 ipython 的脚本。这会将模块加载到主工作区,从而可以轻松地对函数执行 %timeit 测试。


其他 ipython 个脚本使用

#!/usr/bin/python
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
    sys.exit(
        load_entry_point(...)

我使用这种风格编写的代码不多,但我看不出这种启动如何将 argv 传递给解释器。当模块加载并启动时 运行,解释器已经 运行.

一般来说,ipython 处理 -i-m-c 等选项的方式与常规 python 基本相同。它可以使用自己的代码来执行此操作,而不是委托给解释器。但是像 -v-O-t 这样的东西适用于解释器,而不是 REPL,并且不由 ipython 代码处理。

您可以编写自己的 ipython shebang 脚本。

这里我复制了我的 ipython 脚本并添加了 -v

#!/usr/local/bin/python3.5 -v

# -*- coding: utf-8 -*-
import re
import sys

from IPython import start_ipython

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(start_ipython())

现在当我执行 ./vipython 时,我在启动和关闭时得到很多页 import 信息。

我从其他 SO 问题中了解到,我可能无法向这样的 shebang 行添加多个选项。

How to use multiple arguments with a shebang (i.e. #!)?

例如

#!/usr/local/bin/python3.5 -vv

有效,但

#!/usr/local/bin/python3.5 -v -v

不会 - 它给了我

1008:~/mypy$ ./vipython
Unknown option: - 
usage: /usr/local/bin/python3.5 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Try `python -h' for more information.