diff --git a/main.go b/main.go index 8be7ea2e..99580354 100644 --- a/main.go +++ b/main.go @@ -74,6 +74,36 @@ func xmain(args []string) { } else { _, err := py.RunFile(ctx, args[0], py.CompileOpts{}, nil) if err != nil { + if py.IsException(py.SystemExit, err) { + args := err.(py.ExceptionInfo).Value.(*py.Exception).Args.(py.Tuple) + if len(args) == 0 { + os.Exit(0) + } else if len(args) == 1 { + if code, ok := args[0].(py.Int); ok { + c, err := code.GoInt() + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + os.Exit(c) + } + msg, err := py.ReprAsString(args[0]) + if err != nil { + fmt.Fprintln(os.Stderr, err) + } else { + fmt.Fprintln(os.Stderr, msg) + } + os.Exit(1) + } else { + msg, err := py.ReprAsString(args) + if err != nil { + fmt.Fprintln(os.Stderr, err) + } else { + fmt.Fprintln(os.Stderr, msg) + } + os.Exit(1) + } + } py.TracebackDump(err) os.Exit(1) } diff --git a/repl/repl.go b/repl/repl.go index f6639b25..faf9859d 100644 --- a/repl/repl.go +++ b/repl/repl.go @@ -7,6 +7,7 @@ package repl import ( "fmt" + "os" "sort" "strings" @@ -109,6 +110,36 @@ func (r *REPL) Run(line string) { } _, err = r.Context.RunCode(code, r.Module.Globals, r.Module.Globals, nil) if err != nil { + if py.IsException(py.SystemExit, err) { + args := err.(py.ExceptionInfo).Value.(*py.Exception).Args.(py.Tuple) + if len(args) == 0 { + os.Exit(0) + } else if len(args) == 1 { + if code, ok := args[0].(py.Int); ok { + c, err := code.GoInt() + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + os.Exit(c) + } + msg, err := py.ReprAsString(args[0]) + if err != nil { + fmt.Fprintln(os.Stderr, err) + } else { + fmt.Fprintln(os.Stderr, msg) + } + os.Exit(1) + } else { + msg, err := py.ReprAsString(args) + if err != nil { + fmt.Fprintln(os.Stderr, err) + } else { + fmt.Fprintln(os.Stderr, msg) + } + os.Exit(1) + } + } py.TracebackDump(err) } } diff --git a/stdlib/sys/sys.go b/stdlib/sys/sys.go index 3a2318eb..fc6efc5a 100644 --- a/stdlib/sys/sys.go +++ b/stdlib/sys/sys.go @@ -133,7 +133,11 @@ func sys_exit(self py.Object, args py.Tuple) (py.Object, error) { return nil, err } // Raise SystemExit so callers may catch it or clean up. - return py.ExceptionNew(py.SystemExit, args, nil) + exc, err := py.ExceptionNew(py.SystemExit, args, nil) + if err != nil { + return nil, err + } + return nil, exc.(*py.Exception) } const getdefaultencoding_doc = `getdefaultencoding() -> string