我正在尝试使用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返回非零状态代码?
答案 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
。