4

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

4

6 回答 6

7

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

  1. 查找文件中的共同特征。你正好有四种东西可以作为这个候选者。

    • 进口 ( import)

    • 函数定义 ( def)

    • 类定义 ( class)

    • 全局变量赋值

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

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

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

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

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

于 2009-06-23T10:36:48.667 回答
4

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

于 2009-06-23T14:36:20.977 回答
3

很多人坚信你不应该在其中包含带有 IPython 语法的脚本,但是如果你足够好奇(就像我一样)并且正在寻找一些有趣的方法来混合 python 和 shell 脚本,你应该查看我的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.
于 2011-10-07T01:07:59.027 回答
2

如果您将命令输入到 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 命令粘贴的所有代码都应该可以正常工作了。

于 2009-06-24T20:01:54.773 回答
1

你能行的。

这是一个例子。

这是 a.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.

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

于 2015-12-22T15:37:37.617 回答
0

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

于 2009-06-23T13:29:47.177 回答