8

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

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 shell 时,没有宏:

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]: []

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

4

3 回答 3

12

我在几个不起眼的地方找到了答案。

首先,在 $HOME/.ipython 中的 README 中,它说:“有关配置 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`

此配置文件的旧文档在这里: 配置 ipython 命令行应用程序。最新版本(截至 2020 年 1 月)在配置和自定义部分得到了很大改进。

最后,我在storemagic的文档中找到了我的答案[链接更新,2020 年 1 月]:

%store 用于轻量级持久性的魔法。在 IPython 的数据库中存储变量、别名和宏。要在启动时自动恢复存储的变量,请将其添加到您的 ipython_config.py 文件中:

c.StoreMagics.autorestore = True

添加,重新启动 IPython 并砰!有我的宏。凉爽的!

于 2013-07-17T19:44:50.400 回答
9

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

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)。

于 2014-06-19T19:03:21.313 回答
4

我必须承认,有时为 ipython 找到一个好的文档是一场噩梦(对于基础知识)。看起来这个交互式控制台是为真正的编程大师创建的。至少,这就是我在尝试解决一个简单的问题时的感觉,比如保存一个变量以备后用……这在 matlab 中并不简单。

但是要回答你的问题...尝试打开 ipython 通常只需输入 ipython 然后写 %store -r

它应该使用原始名称恢复您的数据。我仍然不知道将变量存储到文件中或仅恢复我想要的变量的用途。顺便说一句,要知道存储变量的名称,请键入 %store。

希望对你有效。

于 2013-08-15T16:55:42.843 回答