子进程没有引发CalledProcessError

时间:2016-05-24 22:49:38

标签: python bash python-2.7 exception subprocess

我有一个循环遍历几个文件路径的脚本,以便使用子进程执行其他一些python和bash脚本。

我知道这些脚本偶尔会失败,我想捕获异常并停止循环/退出调用脚本。这看起来应该很简单 - 但我很难让它发挥作用。

我尝试了很多子流程方法,而且我似乎无法从任何中捕获CalledProcessError(callcheck_callcheck_output Popen)。

# 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

3 个答案:

答案 0 :(得分:2)

我遇到了完全相同的问题,并开始调试到subprocess.py。

后来我意识到我从未在subprocess.run()函数中达到断点。

比我想起来的是,我之前确实为python35安装了 subprocess.run 软件包。

删除软件包后,它又可以工作了。

答案 1 :(得分:0)

ipython看起来并未在异常上返回非零退出代码,这是subprocess.check_output引发CalledProcessError所必需的。只需使用python

$ cat test.py 
1/0
$ python test.py 
Traceback (most recent call last):
  File "test.py", line 1, in <module>
    1/0
ZeroDivisionError: integer division or modulo by zero
$ echo $?
1
$ ipython test.py
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
/Users/alexhall/Dropbox/python/sandbox/test.py in <module>()
----> 1 1/0

ZeroDivisionError: integer division or modulo by zero
$ echo $?
0

或者,只需导入脚本或使用execfile或类似的东西。

答案 2 :(得分:0)

有趣的是,我想要完全发生在你身上的事情,我不能,因为我没有使用try,除了(我在python 2.7中)。 如果你只是这样做会发生什么?

for script in ['w', 'x', 'y']:
    out = subprocess.check_output('ipython {}.py'.format(script).split())
    print(out)

据我所知,这个神秘的子进程,如果你想让程序停止,你必须从try except结构中解开,因为当退出状态为1时,subprocess.check_output将默认停止。

相关问题