我有几个IPython脚本,这有多余的功能。我谨重构的共同功能成为一个模块,包括该模块在现有的剧本。问题是它不能由一个python模块代码使用Ipython的语言扩展(!, $等)。它是可以做一个模块具有IPython码,并将其包括在另一个IPython脚本?

有帮助吗?

解决方案

你不应该节省IPython延长的东西(?, !, %run)在文件。过。这些都是交互式工具和他们的东西你的类型与你的手中,但从来没有保存一个文件。

  1. 找到共同特征之间的文件。你有四种东西,是候选人。

    • 进口(import)

    • 功能的定义(def)

    • 类定义(class)

    • 全球变量分配

    你必须删除所有IPython互动功能,从这个代码。这一切。

  2. 重写你的脚本,使他们(1)进口共同的东西,(2)做有益的工作,他们应该做的。

    你必须删除所有IPython互动功能,从这个代码。这一切。

    现在你可以运行,你的脚本和他们做他们的工作,如适当的蟒蛇脚本是应该。

你仍然可以使用IPython扩展的特色 !, ?%run 当你打字输入,但不应保存这些文件。

其他提示

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

很多人强烈认为你不应该在其中使用带有IPython语法的脚本,但是如果你很好奇(就像我一样)并且正在寻找一些有趣的方法来混合python和shell脚本,你应该在上查看我的包装程序

示例用例:

$ 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.

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

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

你可以做到。

这是一个例子。

这是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']

所以,你“导入” &QUOT;模块&QUOT;不像你在python中那样做,但就像你在shell中用 source 做的那样。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top