【问题标题】:In IPython how to execute a command every line在IPython中如何每行执行一个命令
【发布时间】:2015-08-04 14:38:12
【问题描述】:

我想知道是否可以为输入的每一行执行一个命令。

能够打开/关闭它会很棒。

我的应用程序是在调试期间向 GUI 发送“更新”命令。 同样有趣的可能是将输入的内容通过管道传输到文件等。

示例:

In [1]: h.Draw("E","","")
Out[1]: 1922L
In [2]: h1.Draw("E","","same")
Out[2]: 1234L
In [3]: rt.gPad.Modified();rt.gPad.Update()
In [4]: h2.Draw("E","","same")
Out[4]: 3214L
In [5]: rt.gPad.Modified();rt.gPad.Update()

转换为:

In [1]: startUpdating()
In [2]: h.Draw("E","","")
Out[2]: 1922L
In [3]: h1.Draw("E","","same")
Out[3]: 1234L
In [4]: h2.Draw("E","","same")
Out[4]: 3214L

【问题讨论】:

  • 您不只是在描述交互式会话和运行脚本之间的区别吗?
  • 不完全是,我想。在交互式会话中没有自动化,因此它只执行,输入什么。我想自定义交互式会话。
  • “它只被执行,输入什么” - 而不是......什么,究竟是什么?你认为这是什么?你想达到什么目的?您要调试什么 GUI?您现在如何运行它,这会导致什么问题?
  • 添加了一个例子。在 pyroot 中,我需要在特定用例中绘制后更新 TCanvas
  • get_ipython().events.register('pre_run_cell', func) 将在您输入的每个代码块之前注册一个要调用的函数。如果您希望它在您键入的代码之后运行,请将“pre”更改为“post”。

标签: python ipython


【解决方案1】:

不是完全自动的,但您可以定义一个自定义的线魔法以更轻松地执行重置。

In [1]: from IPython.core.magic import register_line_magic

In [2]: @register_line_magic
   ...: def renew(line):
   ...:     rt.gPad.Modified()
   ...:     rt.gPad.Update()
   ...:

In [3]: startUpdating()
In [4]: h.Draw("E","","")
Out[4]: 1922L
In [5]: %renew
In [6]: h1.Draw("E","","same")
Out[6]: 1234L
In [7]: %renew
In [8]: h2.Draw("E","","same")
Out[8]: 3214L

【讨论】:

  • 我也可以定义一个短名称的方法并在每个 .Draw 之后使用它我希望 IPython 更灵活以允许自动化
  • 基于%%timeit 魔法,我假设有一种方法可以定义类似的东西,它会在提供给%%renew 的每一行之后调用您的重置代码。仍然不是您想要的,但也许对 IPython 的魔法系统进行一些研究会有所收获。
【解决方案2】:

现在我正在包装 Draw 方法

def ReDraw(self,*args, **kwargs):
      self.Draw(*args, **kwargs)
      rt.gPad.Modified()
      rt.gPad.Update()

rt.TTree.ReDraw = ReDraw
h.ReDraw("E","","")

这不是要求的,我希望也有一个 IPython 特定的方式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    相关资源
    最近更新 更多