答案 0 :(得分:1)
自IPython
4.0.1起,!cmd
转换为get_ipython().system(repr(cmd))
(IPython.core.inputtransformer._tr_system()
)。
在源代码中,它实际上是InteractiveShell.system_raw()
,inspect.getsourcefile()
和inspect.getsource()
可以说明。
它委托给Windows中的os.system()
和其他操作系统中的subprocess.call()
。从代码中可以看出,这是不可配置的。
因此,您需要将其替换为可调用subprocess.check_call()
的内容。
除了手工修补猴子外,还可以使用IPython configuration system来完成。可用选项(使用%config
魔法查看)不允许将TerminalInteractiveShell
替换为另一个类,但有几个TerminalIPythonApp
选项允许在启动时执行代码。
请仔细检查一下你是否真的需要这样:通过system_raw()
的来源查看它会设置_exit_code
变量 - 所以它实际上并没有完全失败 / em>默默地。
答案 1 :(得分:0)
如果您使用!
执行shell命令,错误将静默传递
!echo "hello" && exit 1
hello
如果使用%%sh
单元魔术执行shell命令,则会出现错误:
%%sh
echo "hello" && exit 1
hello
---------------------------------------------------------------------------
CalledProcessError Traceback (most recent call last)
<ipython-input-10-9229f76cae28> in <module>
----> 1 get_ipython().run_cell_magic('sh', '', 'echo "hello" && exit 1\n')
~/anaconda/envs/altair-dev/lib/python3.6/site-packages/IPython/core/interactiveshell.py in run_cell_magic(self, magic_name, line, cell)
2360 with self.builtin_trap:
2361 args = (magic_arg_s, cell)
-> 2362 result = fn(*args, **kwargs)
2363 return result
2364
~/anaconda/envs/altair-dev/lib/python3.6/site-packages/IPython/core/magics/script.py in named_script_magic(line, cell)
140 else:
141 line = script
--> 142 return self.shebang(line, cell)
143
144 # write a basic docstring:
<decorator-gen-110> in shebang(self, line, cell)
~/anaconda/envs/altair-dev/lib/python3.6/site-packages/IPython/core/magic.py in <lambda>(f, *a, **k)
185 # but it's overkill for just that one bit of state.
186 def magic_deco(arg):
--> 187 call = lambda f, *a, **k: f(*a, **k)
188
189 if callable(arg):
~/anaconda/envs/altair-dev/lib/python3.6/site-packages/IPython/core/magics/script.py in shebang(self, line, cell)
243 sys.stderr.flush()
244 if args.raise_error and p.returncode!=0:
--> 245 raise CalledProcessError(p.returncode, cell, output=out, stderr=err)
246
247 def _run_script(self, p, cell, to_close):
CalledProcessError: Command 'b'echo "hello" && exit 1\n'' returned non-zero exit status 1.