on a177213 help sign in
94 lines 2.0 kB history raw
1package main
3// USING_CGO
5/*
6#cgo pkg-config: python3
7#include "pry_python3.h"
9*/
10import "C"
12import (
13 "strings"
14 "unsafe"
17type Python struct{}
19func (p Python) Open() {
20 C.Py_Initialize()
21 p.loadModule("readline")
22 p.Eval("import signal")
23 p.Eval("signal.signal(signal.SIGINT, signal.default_int_handler)")
24 p.Eval("del signal")
27func (p Python) Version() string {
28 return "Python " + C.GoString(C.Py_GetVersion()) + " on " + C.GoString(C.Py_GetPlatform())
31func (p Python) Eval(code string) {
32 ccode := C.CString(code)
33 defer C.free(unsafe.Pointer(ccode))
34 C.GoString(C.pry_eval(ccode, C.Py_file_input))
37func (p Python) EvalExpression(code string) string {
38 ccode := C.CString(code)
39 defer C.free(unsafe.Pointer(ccode))
40 return C.GoString(C.pry_eval(ccode, C.Py_eval_input))
43func (p Python) EvalFile(file string, args []string) {
44 handle := C.stdin
45 cfile := C.CString(file)
46 defer C.free(unsafe.Pointer(cfile))
48 if file != "-" {
49 cmode := C.CString("r")
51 defer C.free(unsafe.Pointer(cmode))
52 handle = C.fopen(cfile, cmode)
53 defer C.fclose(handle)
54 }
56 argv := C.CString(file + "\x00" + strings.Join(args, "\x00"))
57 defer C.free(unsafe.Pointer(argv))
58 C.pry_eval_file(handle, cfile, C.int(len(args)+1), argv)
61func (p Python) REPLLikeEval(code string) {
62 ccode := C.CString(code)
63 defer C.free(unsafe.Pointer(ccode))
64 C.pry_eval(ccode, C.Py_single_input)
67func (p Python) loadModule(mod string) {
68 cmode := C.CString(mod)
69 defer C.free(unsafe.Pointer(cmode))
70 C.PyImport_ImportModule(cmode)
73func (p Python) REPL() {
74 C.pymain_run_interactive_hook()
76 fn := C.CString("<stdin>")
77 defer C.free(unsafe.Pointer(fn))
78 C.PyRun_InteractiveLoopFlags(C.stdin, fn, nil)
81func (p Python) SetPrompts(ps1, ps2 string) {
82 cps1 := C.CString(ps1)
83 defer C.free(unsafe.Pointer(cps1))
84 cps2 := C.CString(ps2)
85 defer C.free(unsafe.Pointer(cps2))
87 C.pry_set_prompts(cps1, cps2)
90func (p Python) Close() {
91 C.Py_Finalize()
94var Instance = Python{}