关于ZAKER 融媒体解决方案 合作 加入

python – 如何在 jupyter 中定义自定义魔法?

CocoaChina 10-21

我正在使用 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_classclass 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 outputdef load_ipython_extension ( ipython ) : ipython.register_magics ( CppMagics )

无论我是用 ipython notebok 还是 jupyter 笔记本启动我的笔记本电脑 ( 我相信第二个的第一个别名 ) , 当我执行一个单元格时:

%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 ] 提示符之前%运行它们 . 无法导入启动文件 , 因为它们不在 sys.path 上 .

> 扩展是可以导入的 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 )

以上内容由"CocoaChina"上传发布 查看原文
相关标签 魔法移动笔记本

觉得文章不错,微信扫描分享好友

扫码分享