Web site: http://labix.org/lunatic-python
Lunatic Python 1.0 does work on Python 2.5 with Lua 5.1.1 on Windows using the MinGW compiler on Cygwin, but some hacking was necessary.
First, this patch was made, otherwise gcc wouldn't compile it:
diff -ur src-orig/luainpython.c src/luainpython.c --- src-orig/luainpython.c 2007年01月03日 03:03:29.156250000 -0500 +++ src/luainpython.c 2007年01月03日 03:05:11.203125000 -0500 @@ -374,7 +374,7 @@ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ - PyObject_SelfIter, /*tp_iter*/ + 0, /* set later: PyObject_SelfIter, */ /*tp_iter*/ (iternextfunc)LuaObject_iternext, /*tp_iternext*/ 0, /*tp_methods*/ 0, /*tp_members*/ @@ -385,9 +385,9 @@ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ 0, /*tp_init*/ - PyType_GenericAlloc, /*tp_alloc*/ - PyType_GenericNew, /*tp_new*/ - _PyObject_Del, /*tp_free*/ + 0, /* set later: PyType_GenericAlloc, */ /*tp_alloc*/ + 0, /* set later: PyType_GenericNew, */ /*tp_new*/ + 0, /* set later: _PyObject_Del, */ /*tp_free*/ 0, /*tp_is_gc*/ }; @@ -493,7 +493,9 @@ luaopen_io(L); luaopen_string(L); luaopen_debug(L); - luaopen_loadlib(L); + + luaopen_package(L); + luaopen_python(L); lua_settop(L, 0); } Only in src: luainpython.c~ diff -ur src-orig/luainpython.h src/luainpython.h --- src-orig/luainpython.h 2007年01月03日 03:03:29.156250000 -0500 +++ src/luainpython.h 2007年01月03日 03:04:31.359375000 -0500 @@ -29,7 +29,8 @@ int refiter; } LuaObject; -PyAPI_DATA(PyTypeObject) LuaObject_Type; +/* PyAPI_DATA(PyTypeObject) LuaObject_Type;*/ +extern PyTypeObject LuaObject_Type; #define LuaObject_Check(op) PyObject_TypeCheck(op, &LuaObject_Type) Only in src: luainpython.h~ diff -ur src-orig/pythoninlua.c src/pythoninlua.c --- src-orig/pythoninlua.c 2007年01月03日 03:03:29.156250000 -0500 +++ src/pythoninlua.c 2007年01月03日 03:01:20.343750000 -0500 @@ -559,6 +559,12 @@ { int rc; + LuaObject_Type.tp_alloc = PyType_GenericAlloc; + LuaObject_Type.tp_new = PyType_GenericNew; + LuaObject_Type.tp_free = _PyObject_Del; + LuaObject_Type.tp_iter = PyObject_SelfIter; + + /* Register module */ luaL_openlib(L, "python", py_lib, 0);
Then I compiled as such:
I then used the pexports trick [1] to generate a libpython25.a from the python25.dll in the c:\windows\system32 directory.
Then it was linked:
I moved python.py out of the way (this seems for older versions of Lua I suppose):
Then it was usable:
$ /test/lua-5.1.1/bin/lua Lua 5.1.1 Copyright (C) 1994-2006 Lua.org, PUC-Rio > require "python" > print(python.globals()) {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__d oc__': None, 'lua': <module 'lua' (built-in)>}
In order to get Lua5.1 working with lunatic python on Unix platforms you don't need to to such elaborate lengths. The following patch does the job based on [2].
Without the following patch, python's readline modules has an internal contention within the terminal handling code which results in when lua module is loaded you get a error from malloc() saying that your memory is corrupt.
There is also another issue that luaopen_loadlib()
has been deprecated which doesn't seem to be documented in the
manual but is on the mailing list post LuaList:/2005-09/msg00322.html .
diff -ru lunatic-python-1.0/src/luainpython.c lunatic-python-1.0-lua5.1/src/luainpython.c --- lunatic-python-1.0/src/luainpython.c 2005年10月19日 00:07:02.000000000 +0100 +++ lunatic-python-1.0-lua5.1/src/luainpython.c 2007年02月05日 20:04:33.869590048 +0000 @@ -488,12 +488,12 @@ if (!L) { L = lua_open(); - luaopen_base(L); - luaopen_table(L); - luaopen_io(L); - luaopen_string(L); - luaopen_debug(L); - luaopen_loadlib(L); + + /* loading each lib separately has some deep conflict + * with python's readline module so we obey the holy + * docs by lua people and use the magic loader. + */ + luaL_openlibs(L); luaopen_python(L); lua_settop(L, 0); }
AlexSayle?
I tried the above patch and found that a few other were necessary to get everything working. python.lua calls loadlib directly rather than package.loadlib. Here is the patch for python.lua (with a patch for every file further below):
diff -ru lunatic-python-1.0/python.lua lunatic-python-1.0-lua5.1/python.lua --- lunatic-python-1.0/python.lua 2003年12月12日 20:37:57.000000000 -0800 +++ lunatic-python-1.0-lua5.1/python.lua 2008年06月26日 22:48:34.000000000 -0700 @@ -1,6 +1,6 @@ local path = os.getenv("LUA_SOPATH") if path then - func = loadlib(path.."/lua-python.so", "luaopen_python") + func = package.loadlib(path.."/lua-python.so", "luaopen_python") if func then func() return @@ -10,7 +10,7 @@ local loaded = false for i = 10, 2, -1 do for j = 10, 2, -1 do - func = loadlib(string.format(modmask, i, j), "luaopen_python") + func = package.loadlib(string.format(modmask, i, j), "luaopen_python") if func then loaded = true func()
I was also required fix the paths and library names from lua to lua5.1 equivalents. Here is all of the above patches combined into one. This worked for me on Ubuntu Hardy Heron lua5.1.2 with lua installed via apt-get.
diff -ru lunatic-python-1.0 lunatic-python-1.0-lua5.1Only in lunatic-python-1.0-lua5.1: build diff -ru lunatic-python-1.0/python.lua lunatic-python-1.0-lua5.1/python.lua --- lunatic-python-1.0/python.lua 2003年12月12日 20:37:57.000000000 -0800 +++ lunatic-python-1.0-lua5.1/python.lua 2008年06月26日 22:48:34.000000000 -0700 @@ -1,6 +1,6 @@ local path = os.getenv("LUA_SOPATH") if path then - func = loadlib(path.."/lua-python.so", "luaopen_python") + func = package.loadlib(path.."/lua-python.so", "luaopen_python") if func then func() return @@ -10,7 +10,7 @@ local loaded = false for i = 10, 2, -1 do for j = 10, 2, -1 do - func = loadlib(string.format(modmask, i, j), "luaopen_python") + func = package.loadlib(string.format(modmask, i, j), "luaopen_python") if func then loaded = true func() diff -ru lunatic-python-1.0/setup.py lunatic-python-1.0-lua5.1/setup.py --- lunatic-python-1.0/setup.py 2005年10月18日 16:10:07.000000000 -0700 +++ lunatic-python-1.0-lua5.1/setup.py 2008年06月26日 22:48:34.000000000 -0700 @@ -9,7 +9,7 @@ # You may have to change these PYLIBS = ["python"+get_python_version(), "pthread", "util"] PYLIBDIR = [get_python_lib(standard_lib=True)+"/config"] -LUALIBS = ["lua", "lualib"] +LUALIBS = ["lua5.1"] LUALIBDIR = [] setup(name="lunatic-python", diff -ru lunatic-python-1.0/src/luainpython.c lunatic-python-1.0-lua5.1/src/luainpython.c --- lunatic-python-1.0/src/luainpython.c 2005年10月18日 16:07:02.000000000 -0700 +++ lunatic-python-1.0-lua5.1/src/luainpython.c 2008年06月26日 22:48:34.000000000 -0700 @@ -22,9 +22,9 @@ */ #include <Python.h> -#include <lua.h> -#include <lauxlib.h> -#include <lualib.h> +#include <lua5.1/lua.h> +#include <lua5.1/lauxlib.h> +#include <lua5.1/lualib.h> #include "pythoninlua.h" #include "luainpython.h" @@ -488,12 +488,12 @@ if (!L) { L = lua_open(); - luaopen_base(L); - luaopen_table(L); - luaopen_io(L); - luaopen_string(L); - luaopen_debug(L); - luaopen_loadlib(L); + + /* loading each lib separately has some deep conflict + * with python's readline module so we obey the holy + * docs by lua people and use the magic loader. + */ + luaL_openlibs(L); luaopen_python(L); lua_settop(L, 0); } diff -ru lunatic-python-1.0/src/pythoninlua.c lunatic-python-1.0-lua5.1/src/pythoninlua.c --- lunatic-python-1.0/src/pythoninlua.c 2005年10月18日 16:07:07.000000000 -0700 +++ lunatic-python-1.0-lua5.1/src/pythoninlua.c 2008年06月26日 22:48:34.000000000 -0700 @@ -22,8 +22,8 @@ */ #include <Python.h> -#include <lua.h> -#include <lauxlib.h> +#include <lua5.1/lua.h> +#include <lua5.1/lauxlib.h> #include "pythoninlua.h" #include "luainpython.h"
--ZachDwiel?