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

IPython脚本-使用状态代码退出脚本,python,ipython,Python,Ipython,我尝试使用ipython编写git预提交钩子的脚本,因为它有一个很好的语法来运行shell命令并将stdout结果转换为字符串列表(这便于处理) 我需要返回状态码!=0,以便git预提交挂钩将中止提交 考虑这个示例脚本 #! /bin/ipython import sys sys.exit(1) 从外壳上运行它 $ ipython test.ipy 但是,使用$echo$?检查状态代码时,总是返回0 有没有办法让ipython返回非零状态代码?打开ipython,尝试以交互方式运行该代码 I

我尝试使用ipython编写git预提交钩子的脚本,因为它有一个很好的语法来运行shell命令并将stdout结果转换为字符串列表(这便于处理)

我需要返回状态码!=0,以便git预提交挂钩将中止提交

考虑这个示例脚本

#! /bin/ipython
import sys
sys.exit(1)
从外壳上运行它

$ ipython test.ipy
但是,使用
$echo$?
检查状态代码时,总是返回
0


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

打开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)

制作该可执行文件,然后将钩子的hashbang设置为
#/usr/bin/ipysh

我知道它正在捕获非零出口代码。我想看看是否有人回避了这个问题。(bang语法太好了!我肯定有人尝试用ipython来shell脚本!)