如何将ipython magic输出存储到变量中

如何将ipython magic输出存储到变量中,python,ipython,ipython-magic,Python,Ipython,Ipython Magic,我是python和Ipython的初学者。这可能是一个微不足道的问题。它可能与其他问题重复。但是我不知道我应该搜索什么关键词 我已经知道如何与shell交互 例如: In [1]: a = !ls In [2]: a ...same ls result as shell... In [3]: type(a) Out[3]: IPython.utils.text.SList %%some_magics balabala balabala a = _ 但是,如何与Ipython

我是python和Ipython的初学者。这可能是一个微不足道的问题。它可能与其他问题重复。但是我不知道我应该搜索什么关键词

我已经知道如何与shell交互

例如:

In [1]: a = !ls
In [2]: a
        ...same ls result as shell...
In [3]: type(a)
Out[3]: IPython.utils.text.SList
%%some_magics
balabala
balabala

a = _
但是,如何与Ipython magic互动

比如说

In [1]: a = %history -t 
        ...Ipython result...
In [2]: a
In [3]: type(a)
Out[3]: NoneType

具体来说,对于history命令,最简单的解决方案是

In [243]: history -t -f history.txt
In [244]: with open('history.txt') as f:
   .....:     HIST = [l.strip() for l in f]
   .....:     

In [245]: len(HIST)
Out[245]: 258

In [246]: HIST[-1]
Out[246]: "get_ipython().magic(u'history -t -f history.txt')"

In [247]: 
基本上,将其转储到一个文件中并读回

这似乎是一个难题,但我怀疑它来自于伊皮顿的本性。它实际上不是解释器,而是底层解释器的命令行shell。我的怀疑是magic命令是在IPython内部处理的,没有经过将命令传递给解释器、捕获输出并将其作为Out[n]存储在命令历史记录中的正常路径。因此,它不可用于召回和分配

另一种选择是get_ipython.magic只返回None

无论哪种方式,%历史记录的屏幕输出d=都不可用。您必须将其转储到文件中

每一个魔法命令似乎都有所不同。例如,alias会返回屏幕输出

In [288]: a=%alias
Total number of aliases: 17

In [289]: a
Out[289]: 
[('cat', 'cat'),
 ('clear', 'clear'),
 ('cp', 'cp'),
 ('ldir', 'ls -F -G -l %l | grep /$'),
 ('less', 'less'),
 ('lf', 'ls -F -l -G %l | grep ^-'),
 ('lk', 'ls -F -l -G %l | grep ^l'),
 ('ll', 'ls -F -l -G'),
 ('ls', 'ls -F -G'),
 ('lx', 'ls -F -l -G %l | grep ^-..x'),
 ('man', 'man'),
 ('mkdir', 'mkdir'),
 ('more', 'more'),
 ('mv', 'mv'),
 ('rm', 'rm'),
 ('rmdir', 'rmdir'),
 (u'show', u'echo')]

In [290]: 

我正在处理一个ipython重新加载项目,希望有一个快速的方法从以前的%run语句中进行选择。我的解决办法如下

import os

histvar = os.popen("ipython -c 'history -g'").read()

#regex match / do stuff here

使用line magic,您可以使用result=%lsmagic将结果放入变量中; 借助cell magic,多亏了ipython,您可以使用u获得结果,例如:

In [1]: a = !ls
In [2]: a
        ...same ls result as shell...
In [3]: type(a)
Out[3]: IPython.utils.text.SList
%%some_magics
balabala
balabala

a = _
至少对于%history命令,输出被写入stdout,因此通过将其重定向到StringIO,您可以在不使用任何临时文件的情况下捕获输出,如下所示:

@寄存器\u行\u魔术 def get_magic_OUT命令: ipy=得到ipython out=io.StringIO 使用重定向\u stdout: ipy.magiccommand return out.getvalue 然后您可以这样使用:

在[1]:import get\u magic\u out as我们实际上不使用这个模块,因为有“@register\u line\u magic”装饰器 在[2]中:x=%get\u magic\u out history 在[3]:x中 Out[3]:“导入get\u magic\u Out\nx=%get\u magic\u Out历史记录\n”
我知道这是一个很老的问题,但是这个功能的文档记录得很差,所以我想我至少应该尝试记录一下我是如何做到这一点的,这样可以避免其他人遇到与我同样的麻烦。TLDR:使用@needs\u local\u scope并用您的值更新local\n字典

为了获得更详细的解决方案,我想返回动态变量,其中每个变量都是一个数据帧。最后,这就是我的工作Juypter笔记本的样子:

In  [1]: %load_ext faker_maker

In  [2]: %%build_fake_dataframes
         names
         ----
         first_name
         last_name

In  [3]: names
Out [3]:
            first_name    last_name
         0        Fred        Smith
         1      George         Wood
为了实现上述功能,我有另一个名为faker_maker.py的文件,其中包含以下内容:

from IPython.core.magic import (Magics, magics_class, register_cell_magic,
                                line_cell_magic, needs_local_scope)
import pandas as pd

class FakeDataFrameBuilder():
    dataframes = {}

    def __init__(text):
        ...

    def parse():
        ...

@magics_class
class AutoMagics(Magics):
    @needs_local_scope
    @line_cell_magic
    def build_fake_dataframes(self, line, cell, local_ns=None):
        cls = FakeDataFrameBuilder(cell)
        cls.parse()
        for name, df in cls.dataframes.items():
            local_ns[name] = df

def load_ipython_extension(ipython):
    ipython.register_magics(AutoMagics)
我还有一个重要的提示:

每次更改*.py文件时,请确保在Jupyter中重新启动内核。这是必需的,以便%load\u ext可以重新加载您的文件。
?历史告诉你它的定义。导入IPython.core.magics.history.HistoryMagics将允许您调用它。xxx=IPython.core.magics.history.history magics和xxx.history给出了一个错误。然后我被卡住了。我认为将神奇的结果转储到文件中可能是一个解决方案,我可以将代码写入自定义模块以供重用。然而,我想知道是否有一个简单的方法来做到这一点,而不是任何具体的魔术?如果不是,为什么Ipython不提供此解决方案?“魔法命令在Ipython内部处理。”好吧,这似乎是一个可能的原因。顺便说一句,我认为这些alias命令与Ipython magic无关,不包括%alias本身。这些都是基于shell命令而不是魔法的,我将把这个问题提一会儿,我仍然感谢您的解释。同意alias与shell命令相关。。但它也是一个返回其输出的%magic命令的示例。我不认为你能为所有这些问题找到一个单一的解决方案。另外,对于history命令,值得注意的是ipython自动填充的特殊In和Out变量