2009-06-23 80 views
4

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

回答

7

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

  1. 查找文件之间的共同特征。你有四种东西可以选择。

    • 进口(import

    • 函数定义(def

    • 类定义(class

    • 全局变量分配

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

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

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

    现在你可以运行你的脚本,并且他们的工作就像正确的Python脚本。

你仍然可以使用IPython的扩展功能,如!?%run在打字的时候,但不应将这些保存到文件中。

+0

林不知道我会怎么做。我的IPython脚本只是替换调用其他命令的bash脚本。如果我要删除IPython扩展功能!等等,我无法实现我打算做的事情。 – sharjeel 2009-06-23 11:34:49

+2

@sharjeel:仔细看看子进程模块。您可以替换“!”有适当的subprocess.Popen()函数调用。这将允许您创建没有扩展名的模块。 – 2009-06-23 11:40:33

+2

IPython语法根本不是用于交互式使用。为什么你会有.ipy扩展名?如果你喜欢,你可以在脚本中使用IPython语法。 – 2012-07-06 23:07:20

0

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

4

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

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的外壳的HIST命令粘贴应该正常工作的代码。

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

你可以这样做。

这里是一个例子。

这是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,但像你source做壳。

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

相关问题