Herafter is an excerpt of a mail of jredford@lehman.com about Python/STk mail I hope it will suffice to build a running system (I had no time to test it). ------------------ This is the file I added.. python-stk.c: #include #include #include #include PRIMITIVE python_init(void) { initall(); return UNDEFINED; } PRIMITIVE python(SCM string) { run_command(CHARS(string)); return UNDEFINED; } SCM convert(object *o) { if is_intobject(o) { return makeinteger(getintvalue(o)); } else { if is_floatobject(o) { return makenumber(getfloatvalue(o)); } else { if is_stringobject(o) { return makestrg(getstringsize(o),getstringvalue(o)); } else { if is_tupleobject(o) { int i,j = gettuplesize(o); SCM vec; vec = makevect(j,makeinteger(0)); for (i = 0; i < j; i++) { vector_set(vec, makeinteger(i), convert(gettupleitem(o,i))); } return vector2list(vec); } else { if is_listobject(o) { int i,j = getlistsize(o); SCM vec; vec = makevect(j,makeinteger(0)); for (i = 0; i < j; i++) { vector_set(vec, makeinteger(i), convert(getlistitem(o,i))); } return vector2list(vec); } } } } } return UNDEFINED; } PRIMITIVE python_value(SCM dict, SCM var) { object *m, *d, *v; m = add_module(CHARS(dict)); if (m == NULL) return UNDEFINED; d = getmoduledict(m); v = dictlookup(d,CHARS(var)); return convert(v); } char * getprogramname() { return "stk"; } END of file python-stk.c The initall() should be done in init_python-stk(). You might know of a better way to convert the data types, or to more efficiently make lists. These were the calls that I found easilly. I also didnt know how to typecheck the arguments passed. They should all be strings. This is the summary of what I added to primitives.c /* * * p r i m i t i v e s . c -- List of STk subrs */ #ifdef USE_PYTHON extern PRIMITIVE python_init(void); extern PRIMITIVE python(SCM string); extern PRIMITIVE python_value(SCM dict, SCM var); #endif static struct Primitive Scheme_primitives[] = { . . . #ifdef USE_PYTHON {"python-init", tc_subr_0, python_init}, {"python", tc_subr_1, python}, {"python-value", tc_subr_2, python_value}, #endif . . . An example.. well, I never used Tk before Stk, so Im not gonna do anything too pretty. #!/opt/stk/bin/stk -file (python-init) ;This should really be (require "python") or (require "python-stk") (python "import posix") ;Python is a module based language (button ".b" :text "Press me" :borderwidth 2 :background "slate gray" :foreground "gold" :command '(begin (python "a = posix.listdir('.')") (for-each (lambda (a) (.f.lb 'insert 99999 a)) (python-value "__main__" "a")))) (frame ".f") (listbox ".f.lb" :foreground "grey40" :background "grey70" :yscroll ".f.s 'set") (scrollbar ".f.s" :relief "sunken" :command ".f.lb 'yview") (pack .f.lb .f.s :side "right" :fill "y") (pack .b .f) Where this would populate a listbox with the filenames in the current directory, everytime the button was pushed. posix.listdir() returns a python 'list' type. __main__ is the name/alias of the primary module. If I could figure out STk calling enough to use variable args, I'd have made (python-value "a") assume a value of "__main__" for the dict.. Makefile modifications: # This isnt the default python dir, just what I use. should be a # configure option.. --with-python=/opt/python PYTHONDIR = /opt/python PYTHONLIBPATH = $(PYTHONDIR)/lib/python/lib PYTHONCFLAGS = -I$(PYTHONDIR)/include -I$(PYTHONDIR)/include/Py PYTHONOBJ = python-stk.o PYTHONLIB = $(PYLIBPATH)/libModules.a \ $(PYLIBPATH)/libPython.a \ $(PYLIBPATH)/libParser.a \ $(PYLIBPATH)/libObjects.a PYTHONLIBS = -lreadline -ltermcap LIBS = -lnsl -ldl $(PYTHONLIBS) -lm ... /bin/rm -f primitives.o make CFLAGS="$(CFLAGS) -DUSE_PYTHON" primitives.o $(CC) -o stkp-bin -DUSE_PYTHON $(OBJ) $(PYTHONOBJ) -I$(PYTHONDIR)/include/Py -DNO_MAIN $(PYTHONLIBPATH)/config.c userinit.c $(ALLIBS) $(XLIBSW) $(PYTHONLIB) $(LIBS) /bin/rm -f primitives.o Removing primitives.c to recompile with -DUSE_PYTHON is a horrible kludge, as I am sure you agree. The key thing is to also compile in -DNO_MAIN $(PYLIBPATH)/config.c