将 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.
我们如何启动 ipython REPL 并指示它向底层 python 解释器传递一些命令行参数?
例如,我们可以使用
打开一个更详细的 python REPLpython -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.