忽略 python 中的 IPython 魔法

Ignore IPython magic in python

当使用 python 解释器 运行ning 脚本时,忽略 IPython 魔术的最佳方法是什么?

我经常在我的脚本文件中包含 IPython 魔法,因为它与代码交互工作。例如,使用 autoreload 魔法,我不必在进行一些更改和修复错误后保留 reload-ing 模块:

%load_ext autoreload
%autoreload 2

但是,当我尝试使用常用的 python 解释器 运行 此脚本时,出现错误:

  File "<string>", line 1
    %load_ext autoreload
    ^
SyntaxError: invalid syntax

if 语句中包装 IPython 魔术不起作用,因为在文件实际 运行 之前检测到不正确的语法。


那么让 python 忽略 IPython 魔法的最佳方法是什么?

每当您想 运行 然后在 python、pdb、sphinx 等

中更改脚本是很烦人的

对于所有可以从标准输入读取的工具,您可以使用 grep 删除任何魔法线并将结果通过管道传输到 python:

grep -v '^%' magicscript.ipy | python

作为 bash 别名工作得很好:

alias pynomagic='( grep -v "^%" | python ) < '
pynomagic magicscript.ipy

像 pdb 这样只接受文件名的工具可以这样调用(bash):

pdb <(grep -v '^%' magicscript.ipy)

你应该在你的配置文件中加载这样的魔法,而不是在你的脚本中!它只是无效 Python.

在您的 ~/.ipython/profile_default/ipython_config.py 中输入以下内容:

c = get_config()
c.InteractiveShellApp.extensions = ['autoreload']
c.InteractiveShellApp.exec_lines = ['%autoreload 2']
c.InteractiveShellApp.exec_lines.append('print("Warning: disable autoreload in ipython_config.py to improve performance.")')
  1. 创建一个名为 simplepython.tpl 的模板文件。复制以下语句。

    {% extends 'python.tpl'%}
    {% block codecell %}
    {{  super().replace('get_ipython','#get_ipython') if "get_ipython" in super() else super() }}
    {% endblock codecell %}
    
  2. 保存simplepython.tpl.

  3. 在命令行中输入:

    jupyter nbconvert --to python 'IPY Notebook' --template=simplepython.tpl --stdout

如果这对任何人有帮助。

至少对于 Databricks,在 Github 中将笔记本与 .py 文件同步时,可以使用特殊格式的注释指定魔术函数。 像这样:

# MAGIC %run ./my_external_file