Lunatic Python |
|
Python 是 Python 和 Lua 之间的双向桥梁。
网站: http://labix.org/lunatic-python
Lunatic Python 1.0 确实可以在 Windows 上使用 MinGW 编译器在 Cygwin 上使用 Python 2.5 和 Lua 5.1.1 上运行,但需要进行一些修改。
首先,进行了此修补,否则 gcc 无法编译它
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);
然后我这样编译
然后我使用 pexports 技巧 [1] 从 c:\windows\system32 目录中的 python25.dll 生成 libpython25.a。
然后链接
我将 python.py 移开了(我认为这适用于旧版本的 Lua)
然后它就可以使用了
$ /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)>}
为了让 Lua5.1 在 Unix 平台上与 lunatic python 一起工作,您不需要进行如此复杂的步骤。以下修补程序基于 [2] 完成了这项工作。
如果没有以下修补程序,python 的 readline 模块在终端处理代码中存在内部冲突,这会导致加载 lua 模块时,您会收到来自 malloc() 的错误,提示您的内存已损坏。
还有一个问题是 luaopen_loadlib()
已被弃用,这似乎在手册中没有记录,但在邮件列表帖子 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?
我尝试了上面的修补程序,发现还需要其他一些修补程序才能使一切正常工作。python.lua 直接调用 loadlib 而不是 package.loadlib。以下是 python.lua 的修补程序(下面每个文件都有一个修补程序)
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()
我还需要将路径和库名称从 lua 更改为 lua5.1 等效项。以下是所有上述补丁合并成一个。这在我的 Ubuntu Hardy Heron lua5.1.2 上通过 apt-get 安装的 lua 运行良好。
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?