【发布时间】:2016-09-22 08:26:00
【问题描述】:
我有一个脚本,它遍历几个文件路径,以便使用子进程执行一些其他 python 和 bash 脚本。
我知道这些脚本偶尔会失败,我想捕获异常并停止循环/退出调用脚本。这看起来应该很简单——但我要让它发挥作用。
我尝试了许多子流程方法,但我似乎无法从其中任何中捕获 CalledProcessError(call、check_call、check_outputPopen) .
# calling.py
for script in ['w', 'x', 'y']:
try:
subprocess.check_output('ipython {}.py'.format(script).split())
except subprocess.CalledProcessError as e:
print "Caught CalledProcessError"
raise
except Exception as e:
print "Caught some other exception"
raise
现在想象第一个脚本抛出异常。我希望它导致调用脚本退出。
# w.py
print "w"
a = {}
a[0] # KeyError
相反,调用脚本不会捕获任何异常,调用脚本会继续循环。
$ ipython calling.py
w
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
/Users/h138124/git/exceptional/w.py in <module>()
1 print "w"
2 a = {}
----> 3 a[0]
KeyError: 0
x
y
【问题讨论】:
-
你为什么使用 ipython 来运行文件?还有什么操作系统?
-
@PadraicCunningham 我正在使用 ipython,因为机器上的 python 安装已过时。我正在登录一个我不管理的集群上的名称节点,所以我正在使用它。我用 python 得到了同样的结果。
-
@PadraicCunningham 在 OS X 和 Windows 7 上的结果也相同。
-
如何登录机器?我根本无法在 linux 上复制它
-
@PadraicCunningham 我之前打错了。我在 OS X 和 Linux (CentOS 6.6) 上运行过它。我正在使用 Windows 7 VM 中的 cygwin 通过 ssh 登录(由于愚蠢的 Azure VPN 客户端,我必须这样做)。
标签: python bash python-2.7 exception subprocess