IPython脚本 - 使用状态代码退出脚本

时间:2016-02-03 01:54:27

标签: python ipython

我正在尝试使用ipython编写git pre-commit钩子脚本,因为它有一个很好的语法来运行shell命令并将stdout结果转换为字符串列表(这使得处理起来很容易)。

我需要从ipython脚本返回状态码!= 0,以便git pre-commit hook中止提交。

考虑这个示例脚本

#! /bin/ipython
import sys
sys.exit(1)

从shell运行它

$ ipython test.ipy

但随后使用$ echo $?检查状态代码始终会返回0

有没有办法让ipython返回非零状态代码?

1 个答案:

答案 0 :(得分:1)

打开ipython并尝试以交互方式运行该代码。

In [1]: import sys
In [2]: sys.exit(1)

An exception has occurred, use %tb to see the full traceback.

SystemExit: 1

To exit: use 'exit', 'quit', or Ctrl-D.

因此,ipython正在捕获SystemExit异常。我建议为这个特殊的工作使用不同的解释器,就像ipython一样好。或者,您可以使用:

import os
os._exit(1)

然而,这会跳过各种重要的清理代码(例如finally块)并且通常是一个坏主意。

编辑:

这似乎有效。写完之后,我可以听到远处有一些警钟,还有红旗在挥舞着。不确定那是什么。无论如何,使用:

创建一个新脚本/usr/bin/ipysh
#!/usr/bin/python

import sys
from IPython.core import interactiveshell
shell = interactiveshell.InteractiveShell()
shell.safe_execfile(sys.argv[1], {}, raise_exceptions=True,
                    exit_ignore=False)

制作该可执行文件,然后将您的哈希哈希设置为#!/usr/bin/ipysh