IPython模块

4 投票
6 回答
4405 浏览
提问于 2025-04-15 12:26

我有一些IPython脚本,它们有很多重复的功能。我想把这些共同的功能整理到一个模块里,然后在现有的脚本中使用这个模块。问题是,因为代码使用了IPython的一些特殊语法(比如!和$),所以不能直接把它做成一个Python模块。请问,有没有办法把包含IPython代码的模块做出来,并在其他IPython脚本中使用呢?

6 个回答

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

从技术上讲,如果你把一个脚本保存为 .ipy 这个后缀,ipython 会识别到这个文件,并使用它的一些高级功能,而不是直接交给 Python 解释器来处理。不过,我一般不建议这样做,还是按照上面 S.Lott 的建议来做比较好。

7

你不应该把IPython扩展的内容(比如?!%run)保存到文件里。绝对不可以。这些都是互动工具,是你用手输入的内容,但不应该保存到文件中。

  1. 找出你文件中共同的特征。你有四种东西可以考虑。

    • 导入的模块(import

    • 函数定义(def

    • 类定义(class

    • 全局变量的赋值

    你必须把所有IPython的互动特性从这些代码中删除。全部都要删除。

  2. 重写你的脚本,让它们(1)导入你需要的公共内容,(2)完成它们应该做的有用工作。

    你必须把所有IPython的互动特性从这些代码中删除。全部都要删除。

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

你在输入的时候仍然可以使用IPython的扩展功能,比如!?%run,但不应该把这些保存到文件里。

撰写回答