Python 子进程未引发被调用的进程错误

Python 子进程未引发被调用的进程错误,python,bash,python-2.7,exception,subprocess,Python,Bash,Python 2.7,Exception,Subprocess,我有一个脚本,它通过几个文件路径循环,以便使用子流程执行其他一些python和bash脚本 我知道这些脚本偶尔会失败,我希望捕获异常并停止循环/退出调用脚本。这看起来应该很简单,但我要让它正常工作 我尝试了许多子流程方法,但似乎无法从其中任何一种方法中捕获被调用的流程错误(call,check\u call,check\u outputPopen) 现在想象第一个脚本抛出一个异常。我希望它导致调用脚本退出 # w.py print "w" a = {} a[0] # KeyError 相反

我有一个脚本,它通过几个文件路径循环,以便使用子流程执行其他一些python和bash脚本

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

我尝试了许多子流程方法,但似乎无法从其中任何一种方法中捕获被调用的流程错误(
call
check\u call
check\u output
Popen

现在想象第一个脚本抛出一个异常。我希望它导致调用脚本退出

# 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 calling.py
W
---------------------------------------------------------------------------
KeyError回溯(最近一次呼叫最后一次)
/Users/h138124/git/exception/w.py in()
1打印“w”
2 a={}
---->3A[0]
关键错误:0
x
Y

看起来
ipython
不会在异常时返回非零退出代码,这是
子流程所必需的。请检查\u output
以引发
调用的流程错误。只需使用
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
$cat test.py
1/0
$python test.py
回溯(最近一次呼叫最后一次):
文件“test.py”,第1行,在
1/0
ZeroDivisionError:整数除法或模零除法
$echo$?
1.
$ipython test.py
---------------------------------------------------------------------------
ZeroDivisionError回溯(最近一次呼叫上次)
/在()中的Users/alexhall/Dropbox/python/sandbox/test.py
----> 1 1/0
ZeroDivisionError:整数除法或模零除法
$echo$?
0

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

有趣的是,我想做的正是发生在您身上的事情,但我做不到,因为我没有使用try-except(我使用的是python 2.7)。 如果你这么做会发生什么

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

就我对这个神秘的子流程的理解而言,如果你想让程序停止,你必须从try-except结构中分离出来,因为subprocess.check_输出默认会在退出状态为1时停止。

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

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

我突然想到,我确实在一段时间前为python35安装了subprocess.run


删除包后,它再次工作。

为什么要使用ipython运行文件?还有什么操作系统?@PadraicCunningham我正在使用ipython,因为机器上安装的python已经过时了。我正在登录到集群上的一个名称节点,但我不管理该节点,因此我正在使用它。我在python上得到了相同的结果。@PadraicCchanningham在OS X和Windows 7上也得到了相同的结果。如何登录到机器?我现在无法在linux上复制它all@PadraicCunningham我以前打字打错了。我在OS X和Linux(CentOS 6.6)上运行过它。我正在从Windows7VM使用cygwin通过ssh登录(由于Azure VPN客户端太笨,我不得不这样做)。很有趣。知道这一点很好——尽管它不能解决问题。我使用python得到了相同的结果(没有发现异常,循环继续)。@conner.xyz您能复制我得到的结果吗?python是否有异常脚本的非零返回代码?是的,我可以复制您的结果(python返回1,ipython返回0),但它不会影响在一个脚本运行另一个脚本时捕获异常。请尝试
subprocess。调用
并打印返回值(应该是退出代码)。它是0。无论我使用python还是ipython。它显示了KeyError,但实际上没有捕获任何异常。这很奇怪。我将尝试在main中包装被调用方脚本,并按照您的建议导入。
for script in ['w', 'x', 'y']:
    out = subprocess.check_output('ipython {}.py'.format(script).split())
    print(out)