【问题标题】:IPython ModulesIPython 模块
【发布时间】:2009-06-23 10:03:02
【问题描述】:

我有一些具有冗余功能的 IPython 脚本。我想将通用功能重构为一个模块,并将该模块包含在现有脚本中。问题是它不能成为 python 模块,因为代码使用 Ipython 的语言扩展(!,$ 等)。是否可以制作具有 IPython 代码的模块并将其包含在另一个 IPython 脚本中?

【问题讨论】:

    标签: python module ipython


    【解决方案1】:

    您不应该将 IPython 扩展内容(?!%run)保存在文件中。曾经。这些是交互式工具,它们是您用手键入但从不保存到文件中的东西。

    1. 找出文件的共同特征。你正好有四种东西适合这个。

      • 导入 (import)

      • 函数定义 (def)

      • 类定义 (class)

      • 全局变量赋值

      您必须从此代码中删除所有 IPython 交互功能。全部。

    2. 重写你的脚本,以便它们 (1) 导入你常用的东西,(2) 做他们应该做的有用的工作。

      您必须从此代码中删除所有 IPython 交互功能。全部。

      现在您可以运行您的脚本,它们会像正常的 Python 脚本一样工作。

    您仍然可以在输入时使用 IPython 扩展功能,例如 !?%run,但您不应将它们保存到文件中。

    【讨论】:

    • 我不知道该怎么做。我的 IPython 脚本只是替换调用其他命令的 bash 脚本。如果我要删除 IPython 扩展功能,例如!等等,我将无法实现我打算做的事情。
    • @sharjeel:仔细看子流程模块。您可以替换“!”使用适当的 subprocess.Popen() 函数调用。这将允许您创建没有扩展的模块。
    • IPython 语法根本不适合交互式使用。为什么会有 .ipy 扩展名?如果您愿意,可以在脚本中使用 IPython 语法。
    • @s-lott,在这个答案中,没有单一证据可以证明您所说的话,因此可能会使人们感到困惑。如果你真的确定!,?不能在非交互模式下使用,然后给我们一个参考,手册,源代码,禁止这种用法。我阅读了手册,但在其中找不到禁止在脚本中使用这些运算符的地方。
    【解决方案2】:

    从技术上讲,如果您保存带有.ipy 扩展名的脚本,ipython 会看到并使用它所有的花哨的东西,而不是直接传递给 python 解释器。但是,我通常会建议不要这样做,并走上面 S.Lott 的路线。

    【讨论】:

      【解决方案3】:

      很多人坚信你不应该在其中包含具有 IPython 语法的脚本,但如果你足够好奇(就像我一样)并且正在寻找一些有趣的方法来混合 python 和 shell 脚本,你应该查看我的wrapper program on github

      示例用例:

      $ cat > example.ipy
      
      rehashx
      
      a = !ls -l | tail -n 3
      print a.fields(0)
      
      b = 'foo'
      echo bar ${b}
      

      $ ipyscript.py example.ipy
      
      ['-rw-r--r--', 'drwxr-xr-x', 'drwxrwxr-x']
      bar foo
      

      事实证明,IPython 核心还支持上述脚本的(几乎没有功能的)版本:

      In [2]: IPython.core.interactiveshell.InteractiveShell.safe_execfile_ipy?
      Type:       instancemethod
      Base Class: <type 'instancemethod'>
      String Form:<unbound method InteractiveShell.safe_execfile_ipy>
      Namespace:  Interactive
      File:       /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/core/interactiveshell.py
      Definition: IPython.core.interactiveshell.InteractiveShell.safe_execfile_ipy(self, fname)
      Docstring:
      Like safe_execfile, but for .ipy files with IPython syntax.
      
      Parameters
      ----------
      fname : str
          The name of the file to execute.  The filename must have a
          .ipy extension.
      

      【讨论】:

      • 脚本的链接已损坏。
      【解决方案4】:

      如果您将命令输入到 IPython 的交互式版本中,然后使用 hist 命令(使用 -n 删除行号),IPython 会吐出您运行的所有命令,并使用实际的 Python 代码代替!cd !ls 等。这是一个例子。

      _ip.system("ls")
      _ip.system("ls -F ")
      _ip.magic("cd ")
      

      http://ipython.scipy.org/moin/IpythonExtensionApi 解释了这个对象。这基本上是您需要做的(改编自链接):

      import IPython.ipapi
      _ip = IPython.ipapi.get()
      

      现在您从 IPython shell 的 hist 命令粘贴的所有代码都应该可以正常工作了。

      【讨论】:

      • 但为了记录,我倾向于同意 S. Lott
      • 在较新版本的 ipython 上,您只需运行 _ip = get_ipython()_ip.system() 命令是相同的,但对于 _ip.magic() 运行 _ip.run_line_magic('command', 'arguments') 例如:`_ip.run_line_magic('matplotlib', 'inline')。我将所有这些都放在了一个 %load_ext 命令中。
      【解决方案5】:

      你可以做到的。

      这是一个例子。

      这是一个.ipy文件的内容:

      %run b.ipy
      
      print(myvar)
      print(myfunc())
      

      这是 b.ipy 文件的内容:

      myvar = !echo 1
      
      def myfunc():
        tmp_var = !echo 2
        return tmp_var
      

      如您所见,b.ipy 使用 !操作员。 当您执行 a.ipy 时,您会得到以下结果:

      ipython a.ipy 
      ['1']
      ['2']
      

      因此,您“导入”“模块”不像在 python 中那样,而是像在 shell 中使用 source 那样。

      但我不确定这是否正确,可能是这样。至少它可以工作,并允许您提取通用功能并从其他脚本文件中重用它。

      【讨论】:

        【解决方案6】:

        您看过 IPython 模块 (pydoc IPython) 吗?也许您可以通过纯 Python 代码访问 IPython 的实用程序。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-04-05
          • 1970-01-01
          • 2016-05-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多