我正在使用Ubuntu 14.04 LTS
Anaconda python安装:
Python 3.5.1 :: Anaconda 2.4.1(64位)
我正在尝试使用此配方在我的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)in () ----> 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 (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'
配方中的代码似乎与官方文档(两者都使用IPython.core.magic.magics_class
)一致.我将我cppmagic.py
放在以下目录中
〜/ .ipython/profile_default /启动
让它在笔记本电脑启动时自动加载,但我无法感受到魔力.有人可以帮忙吗?
这里有两个不同的东西:
启动文件是脚本,~/.ipython/profile_[name]/startup
作为启动IPython的一部分执行.%run
在第一次In[1]
提示之前,它们被视为您的每一个.无法导入启动文件,因为它们未启用sys.path
.
扩展是可以导入并定义load_ipython_extension
函数的Python模块.您可以添加扩展名~/.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)