忽略python中的IPython魔法

时间:2015-05-31 15:22:13

标签: python ipython ipython-magic

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

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

%load_ext autoreload
%autoreload 2

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

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

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

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

当你想在python,pdb,sphinx等运行时必须更改你的脚本是很烦人的。

4 个答案:

答案 0 :(得分:3)

对于所有可以从标准输入读取的工具,您可以使用grep删除任何魔术行并将结果传递给python:

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

适合作为bash别名:

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

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

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

答案 1 :(得分:2)

您应该在配置文件中加载这样的魔法,在脚本中而不是!它只是无效的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.")')

答案 2 :(得分:1)

  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

答案 3 :(得分:1)

以防万一。

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

# MAGIC %run ./my_external_file