on a177213 help sign in
92 lines 1.9 kB history raw
1package main
3// USING_CGO
5/*
6#cgo pkg-config: python2
7#include "pry_python2.h"
8*/
9import "C"
11import (
12 "strings"
13 "unsafe"
16type Python struct{}
18func (p Python) Open() {
19 C.Py_Initialize()
20 p.loadModule("readline")
21 p.Eval("import signal")
22 p.Eval("signal.signal(signal.SIGINT, signal.default_int_handler)")
25func (p Python) Version() string {
26 return "Python " + C.GoString(C.Py_GetVersion()) + " on " + C.GoString(C.Py_GetPlatform())
29func (p Python) Eval(code string) {
30 ccode := C.CString(code)
31 defer C.free(unsafe.Pointer(ccode))
32 C.GoString(C.pry_eval(ccode, C.Py_file_input))
35func (p Python) EvalExpression(code string) string {
36 ccode := C.CString(code)
37 defer C.free(unsafe.Pointer(ccode))
38 return C.GoString(C.pry_eval(ccode, C.Py_eval_input))
41func (p Python) EvalFile(file string, args []string) {
42 handle := C.stdin
43 cfile := C.CString(file)
44 defer C.free(unsafe.Pointer(cfile))
46 if file != "-" {
47 cmode := C.CString("r")
49 defer C.free(unsafe.Pointer(cmode))
50 handle = C.fopen(cfile, cmode)
51 defer C.fclose(handle)
52 }
54 argv := C.CString(file + "\x00" + strings.Join(args, "\x00"))
55 defer C.free(unsafe.Pointer(argv))
56 C.pry_eval_file(handle, cfile, C.int(len(args)+1), argv)
59func (p Python) REPLLikeEval(code string) {
60 ccode := C.CString(code)
61 defer C.free(unsafe.Pointer(ccode))
62 C.pry_eval(ccode, C.Py_single_input)
65func (p Python) loadModule(mod string) {
66 cmode := C.CString(mod)
67 defer C.free(unsafe.Pointer(cmode))
68 C.PyImport_ImportModule(cmode)
71func (p Python) REPL() {
72 p.loadModule("readline")
74 fn := C.CString("<stdin>")
75 defer C.free(unsafe.Pointer(fn))
76 C.PyRun_InteractiveLoopFlags(C.stdin, fn, nil)
79func (p Python) SetPrompts(ps1, ps2 string) {
80 cps1 := C.CString(ps1)
81 defer C.free(unsafe.Pointer(cps1))
82 cps2 := C.CString(ps2)
83 defer C.free(unsafe.Pointer(cps2))
85 C.pry_set_prompts(cps1, cps2)
88func (p Python) Close() {
89 C.Py_Finalize()
92var Instance = Python{}