IPython - shell命令失败时引发异常

时间:2016-03-08 01:18:12

标签: ipython

我正在使用IPython as a system shell

有没有办法让shell命令失败时让IPython引发异常? (非零退出代码)

默认设置会使它们无声地失败。

2 个答案:

答案 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.