将 Lua 输出发送到非标准输出。

我有一个嵌入了 Lua 的 C 程序。目前只是一个 hello world。在继续之前,我想能够将 lua 输出发送到除 stdout 以外的其他位置,以便我可以以某种方式操作它。这是我的代码:

#include <stdio.h>

#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

int main() {
    lua_State *luaVM = luaL_newstate();
    //char result[1024];

    if (luaVM == NULL) {
        printf("Error initializing lua!\n");
        return -1;
    }
    luaL_openlibs(luaVM);
    luaL_dostring(luaVM, "print(\"hello world!\")");
    //Somehow put the output into result

    //printf("%s\n%s\n", result, result);

    lua_close(luaVM);
    return 0;
}

例如,我想使用注释中看到的 result 来打印 lua 代码的结果两次。这可以做到吗?

点赞
用户312586
用户312586

如果你的 Lua 代码将要使用 print 来输出东西,那么我猜最简单的方法就是通过 Lua 自身重新定义 print。像这样:

print_stdout = print -- 以防你需要旧的行为

print = function(...)
  for arg,_ in ipairs({...}) do
    -- 在这里将 arg 写入任何文件/流中
  end
end
2012-08-09 15:24:35
用户147407
用户147407

这个答案可能会受到一些读者的批评,但是请先看看我为这个答案专门准备的博客文章,并阅读一下为什么我选择了这个解决方案的前言。

正如承诺的那样,我已经将我旧版本的 Lua 5.1 输出重定向补丁更新到了最新版本。

补丁文件在这里:5.1.55.2.1

补丁

patch -p1 < ~/download/lua-5.2.1-output-redirect.patch

编译

cd src
make a LUA_A="liblua-5.2.1-redirect.a" SYSCFLAGS="-DLUA_USE_LINUX -DLUA_REDIRECT" SYSLIBS="-Wl,-E -ldl -lreadline -lncurses"

检查

nm liblua-5.x.y-redirect.a | grep printf
nm liblua-5.x.y-redirect.a | grep fputs
nm liblua-5.x.y-redirect.a | grep fwrite

测试

这里获得测试程序(C / C++混合,抱歉)。通过以下方式构建它:

g++ -DLUA_REDIRECT -I/path/to/lua-5.2.1/src/ -L. lua-redirect-test.cpp -llua-5.2.1-redirect -ldl -o lua-redirect-test

输出:

===== Test 1 output =====
Lua stdout buffer:
---
hello world!

---
Lua stderr buffer:
---

---
Lua error message:
---
(null)
---
===== Test 2 output =====
Lua stdout buffer:
---

---
Lua stderr buffer:
---

---
Lua error message:
---
[string "bad_function()"]:1: attempt to call global 'bad_function' (a nil value)
---

2012-08-10 15:04:44
用户631634
用户631634

Lua 的 I/O 库可能包含你正在寻找的功能。io.output 函数可以让你设置默认的输出文件。查看 5.2 手册中的 I/O 库部分,了解还有哪些功能。

为什么你想重新定向输出呢?你说你想以某种方式操作它,但具体指的是什么呢?

2012-08-10 17:17:16