10

我是 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

但是,如何与 Ipython 魔术交互呢?

例如

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

5 回答 5

3

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

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

基本上,将其转储到文件中并重新读取。

这可能看起来很杂乱,但我怀疑它来自 IPython 的本质。它实际上不是解释器,而是底层解释器的命令行 shell。我怀疑魔术命令是在 IPython 内部处理的,并且不会通过将命令传递给解释器、捕获输出并将其作为 Out[n] 存储在命令历史记录中的正常路径。所以它不能用于召回和分配。

另一种方法是get_ipython().magic简单地返回None

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

它似乎因每个魔术命令而异。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]: 
于 2015-05-05T17:41:11.047 回答
2

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

import os

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

#regex match / do stuff here
于 2018-03-16T18:38:13.620 回答
2

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

@register_line_magic
def get_magic_out(command):
    ipy = get_ipython()
    out = io.StringIO()

    with redirect_stdout(out):
        ipy.magic(command)

    return out.getvalue()

要点:get_magic_out.py

然后您可以像这样使用它:

In [1]: import get_magic_out as _ # We don't actually use the module, because of the `@register_line_magic` decorator

In [2]: x = %get_magic_out history

In [3]: x
Out[3]: 'import get_magic_out\nx = %get_magic_out history\n'
于 2020-01-09T03:59:28.793 回答
1

使用线魔法,您可以使用result = %lsmagic将结果转换为变量;借助单元格魔法,感谢 ipython,您可以使用 _ 来获取结果,例如:

%%some_magics
balabala
balabala

a = _
于 2019-08-08T06:35:00.113 回答
1

我知道这是一个非常老的问题,但是这个功能的文档记录很差,所以我想我至少会尝试记录我在这里是如何做到的,并为其他一些人省去我遇到的同样的麻烦。TLDR:使用您的值使用@needs_local_scope和更新local_ns字典。

对于更详细的解决方案,我想返回每个都是熊猫数据框的动态变量。最后,这就是我工作的 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_ext可以重新加载您的文件。
于 2020-09-23T02:14:33.793 回答