如何在 jupyter 中定义自定义魔法?
How do I define custom magics in jupyter?
我正在使用 Ubuntu 14.04 LTS
和 Anaconda python 安装:
Python 3.5.1 :: Anaconda 2.4.1 (64-bit)
我正在尝试使用 this recipe 在我的 ipython 笔记本中启用 C++ 交互式编译:
import IPython.core.magic as ipym
@ipym.magics_class
class CppMagics(ipym.Magics):
@ipym.cell_magic
def cpp(self, line, cell=None):
"""Compile, execute C++ code, and return the standard output."""
# Define the source and executable filenames.
source_filename = 'temp.cpp'
program_filename = 'temp.exe'
# Write the code contained in the cell to the C++ file.
with open(source_filename, 'w') as f:
f.write(cell)
# Compile the C++ code into an executable.
compile = self.shell.getoutput("g++ {0:s} -o {1:s}".format(
source_filename, program_filename))
# Execute the executable and return the output.
output = self.shell.getoutput(program_filename)
return output
def load_ipython_extension(ipython):
ipython.register_magics(CppMagics)
当我用 :
执行一个单元格时,我是用 ipython notebok
还是 jupyter notebook
启动我的笔记本(我相信第一个别名是第二个别名)
%load_ext cppmagic
我收到以下错误:
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
<ipython-input-1-7b90c7a2b808> in <module>()
----> 1 get_ipython().magic('load_ext cppmagic')
/home/norah/anaconda3/lib/python3.5/site-packages/IPython/core/interactiveshell.py in magic(self, arg_s)
2334 magic_name, _, magic_arg_s = arg_s.partition(' ')
2335 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
-> 2336 return self.run_line_magic(magic_name, magic_arg_s)
2337
2338 #-------------------------------------------------------------------------
/home/norah/anaconda3/lib/python3.5/site-packages/IPython/core/interactiveshell.py in run_line_magic(self, magic_name, line)
2255 kwargs['local_ns'] = sys._getframe(stack_depth).f_locals
2256 with self.builtin_trap:
-> 2257 result = fn(*args,**kwargs)
2258 return result
2259
/home/norah/anaconda3/lib/python3.5/site-packages/IPython/core/magics/extension.py in load_ext(self, module_str)
/home/norah/anaconda3/lib/python3.5/site-packages/IPython/core/magic.py in <lambda>(f, *a, **k)
191 # but it's overkill for just that one bit of state.
192 def magic_deco(arg):
--> 193 call = lambda f, *a, **k: f(*a, **k)
194
195 if callable(arg):
/home/norah/anaconda3/lib/python3.5/site-packages/IPython/core/magics/extension.py in load_ext(self, module_str)
64 if not module_str:
65 raise UsageError('Missing module name.')
---> 66 res = self.shell.extension_manager.load_extension(module_str)
67
68 if res == 'already loaded':
/home/norah/anaconda3/lib/python3.5/site-packages/IPython/core/extensions.py in load_extension(self, module_str)
87 if module_str not in sys.modules:
88 with prepended_to_syspath(self.ipython_extension_dir):
---> 89 __import__(module_str)
90 mod = sys.modules[module_str]
91 if self._call_load_ipython_extension(mod):
ImportError: No module named 'cppmagic'
食谱中的代码似乎与 the official docs 一致(都使用 IPython.core.magic.magics_class
)我已将我的 cppmagic.py
放在以下目录中
~/.ipython/profile_default/startup
让它在笔记本电脑启动时自动加载,但我无法感受到它的魔力。有人可以帮忙吗?
这里有两个独立的东西:
- 启动文件是
~/.ipython/profile_[name]/startup
中的脚本,作为启动IPython的一部分执行。在第一个 In[1]
提示之前,他们被视为您 %run
每个人。无法导入启动文件,因为它们不在 sys.path
. 上
- extensions 是 Python 可以导入并定义
load_ipython_extension
函数的模块。您可以将扩展放在 ~/.ipython/extensions
中,它们将是可导入的,或者您可以将它们作为常规包安装 pip
.
第一个修复是将您的 cppmagics
移动到 ~/.ipython/extensions
或某个 site-packages
目录,以便它可以导入。
如果您真的希望魔法总是注册(而不是调用 %load_ext cppmagic
),您可以将其保留为启动文件并在脚本末尾注册魔法,而不是 def load_ipython_extension
:
if __name__ == '__main__':
from IPython import get_ipython
get_ipython().register_magics(CppMagics)
我正在使用 Ubuntu 14.04 LTS
和 Anaconda python 安装:
Python 3.5.1 :: Anaconda 2.4.1 (64-bit)
我正在尝试使用 this recipe 在我的 ipython 笔记本中启用 C++ 交互式编译:
import IPython.core.magic as ipym
@ipym.magics_class
class CppMagics(ipym.Magics):
@ipym.cell_magic
def cpp(self, line, cell=None):
"""Compile, execute C++ code, and return the standard output."""
# Define the source and executable filenames.
source_filename = 'temp.cpp'
program_filename = 'temp.exe'
# Write the code contained in the cell to the C++ file.
with open(source_filename, 'w') as f:
f.write(cell)
# Compile the C++ code into an executable.
compile = self.shell.getoutput("g++ {0:s} -o {1:s}".format(
source_filename, program_filename))
# Execute the executable and return the output.
output = self.shell.getoutput(program_filename)
return output
def load_ipython_extension(ipython):
ipython.register_magics(CppMagics)
当我用 :
执行一个单元格时,我是用ipython notebok
还是 jupyter notebook
启动我的笔记本(我相信第一个别名是第二个别名)
%load_ext cppmagic
我收到以下错误:
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
<ipython-input-1-7b90c7a2b808> in <module>()
----> 1 get_ipython().magic('load_ext cppmagic')
/home/norah/anaconda3/lib/python3.5/site-packages/IPython/core/interactiveshell.py in magic(self, arg_s)
2334 magic_name, _, magic_arg_s = arg_s.partition(' ')
2335 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
-> 2336 return self.run_line_magic(magic_name, magic_arg_s)
2337
2338 #-------------------------------------------------------------------------
/home/norah/anaconda3/lib/python3.5/site-packages/IPython/core/interactiveshell.py in run_line_magic(self, magic_name, line)
2255 kwargs['local_ns'] = sys._getframe(stack_depth).f_locals
2256 with self.builtin_trap:
-> 2257 result = fn(*args,**kwargs)
2258 return result
2259
/home/norah/anaconda3/lib/python3.5/site-packages/IPython/core/magics/extension.py in load_ext(self, module_str)
/home/norah/anaconda3/lib/python3.5/site-packages/IPython/core/magic.py in <lambda>(f, *a, **k)
191 # but it's overkill for just that one bit of state.
192 def magic_deco(arg):
--> 193 call = lambda f, *a, **k: f(*a, **k)
194
195 if callable(arg):
/home/norah/anaconda3/lib/python3.5/site-packages/IPython/core/magics/extension.py in load_ext(self, module_str)
64 if not module_str:
65 raise UsageError('Missing module name.')
---> 66 res = self.shell.extension_manager.load_extension(module_str)
67
68 if res == 'already loaded':
/home/norah/anaconda3/lib/python3.5/site-packages/IPython/core/extensions.py in load_extension(self, module_str)
87 if module_str not in sys.modules:
88 with prepended_to_syspath(self.ipython_extension_dir):
---> 89 __import__(module_str)
90 mod = sys.modules[module_str]
91 if self._call_load_ipython_extension(mod):
ImportError: No module named 'cppmagic'
食谱中的代码似乎与 the official docs 一致(都使用 IPython.core.magic.magics_class
)我已将我的 cppmagic.py
放在以下目录中
~/.ipython/profile_default/startup
让它在笔记本电脑启动时自动加载,但我无法感受到它的魔力。有人可以帮忙吗?
这里有两个独立的东西:
- 启动文件是
~/.ipython/profile_[name]/startup
中的脚本,作为启动IPython的一部分执行。在第一个In[1]
提示之前,他们被视为您%run
每个人。无法导入启动文件,因为它们不在sys.path
. 上
- extensions 是 Python 可以导入并定义
load_ipython_extension
函数的模块。您可以将扩展放在~/.ipython/extensions
中,它们将是可导入的,或者您可以将它们作为常规包安装pip
.
第一个修复是将您的 cppmagics
移动到 ~/.ipython/extensions
或某个 site-packages
目录,以便它可以导入。
如果您真的希望魔法总是注册(而不是调用 %load_ext cppmagic
),您可以将其保留为启动文件并在脚本末尾注册魔法,而不是 def load_ipython_extension
:
if __name__ == '__main__':
from IPython import get_ipython
get_ipython().register_magics(CppMagics)