2013-07-17 22 views
7

根据文档,我应该能够定义一个宏并存储它。然后,下次启动IPython shell时宏将可用。但是,这是行不通的:在IPython中存储宏

In [4]: print "Foobarbatbizbuzzbonk" 
Foobarbatbizbuzzbonk 

In [5]: %macro foo 4 
Macro `foo` created. To execute, type its name (without quotes). 
=== Macro contents: === 
print "Foobarbatbizbuzzbonk" 

In [6]: %store foo 
Stored 'foo' (Macro) 

In [7]: quit() 

当我再次启动IPython的外壳,没有宏:

In [1]: foo 
--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 
<ipython-input-1-d3b07384d113> in <module>() 
----> 1 foo 

NameError: name 'foo' is not defined 

In [2]: %macro 
Out[2]: [] 

有谁知道为什么不起作用?

回答

7

我在一些晦涩的地方找到了答案。

首先,在$ HOME发现/ .ipython,它说,自述“欲了解更多有关配置IPython的,这样做:ipython config -h

这样做产生了一堆的帮助,包括以下建议:

To initialize a profile with the default configuration file, do:: 

    $> ipython profile create 

and start editing `IPYTHONDIR/profile_default/ipython_config.py` 

好的,太好了。做过某事。现在,在Configuring the ipython command line application中涵盖了该文件的内容。但是,这个文件没有提到%store。

最后,我发现我的答案在配置和定制,下面扩展与IPython中,在那里你会找到入口storemagic,它说捆绑:

%商店魔法轻型持久性。在IPython的数据库中存储变量,别名 和宏。在启动时自动恢复存储 变量,添加到您的ipython_config.py文件:

c.StoreMagic.autorestore = True 

添加的是,重新启动的IPython和Bang!有我的宏。凉!

4

我必须承认,有时候为ipython找到一个好的文档是一个噩梦(对于基础知识)。这个交互式控制台似乎是为真正的编程大师而创建的。至少,这是我在尝试解决一个简单问题(如保存变量以供后验使用)时所感受的...在matlab中不仅仅是简单的事情。

但是,为了回答你的qestion ...尝试打开IPython的通常只是打字IPython中,然后写%店里-r

它应与原姓名(或名称)恢复数据。我仍然不知道如何将变量存储到文件或恢复我想要的变量。 BTw,要知道您的存储变量的名称,请输入%store。

希望它适合你。

+1

是一样的在这里...... docus很难读:( – tim

7

作为在shell中定义宏并存储它的替代方法,您可以在启动文件中定义该宏。例如,您可以将以下行放入IPYTHONDIR/profile_default/ipython_config中。潘岳:

get_ipython().define_macro('foo','print "Foobarbatbizbuzzbonk"') 

如果要定义一个神奇的命令宏,你可以使用这样的事情:

get_ipython().define_macro('clr',"""get_ipython().magic(u'%reset -sf')"""); 

我还没有想出如何定义一个宏魔术命令用接受参数的选项(例如,输入'rn tmp'而不是'%run -i tmp'来运行ipython命名空间中的文件tmp.py)。

+2

这是更好的答案,因为OP只要求宏是持久的,'%store'也会使变量持久化,这给了我 – dirkjot

+1

为了做到这一点,你必须首先运行'ipython --init',它将创建你的个人配置(默认配置文件)。通过发布'ipython locate'找到你的IPYTHONDIR。 – dirkjot