我有一个运行嵌入式Lua的c程序。截至目前,它只是一个问候世界。然而,在继续前进之前,我希望能够将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代码的结果。可以这样做吗?
答案 0 :(得分:5)
如果您的Lua代码将使用print
输出内容,那么我想最简单的方法是从Lua本身重新定义print
。像这样:
print_stdout = print -- in case you need the old behavior
print = function(...)
for arg,_ in ipairs({...}) do
-- write arg to any file/stream you want here
end
end
答案 1 :(得分:4)
这个答案可以引起一些读者的批评,但首先请看看我为这个答案专门准备的blog post,并阅读前言为什么我选择这个解决方案。
正如所承诺的那样,我已将我的旧Lua 5.1输出重定向补丁扩展到最新版本 可在此处获取补丁:5.1.5和5.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
<强>测试强>:
获取测试程序here(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)
---
答案 2 :(得分:1)
Lua的I / O库可能涵盖了您正在寻找的内容。 io.output
功能允许您设置默认输出文件。查看5.2手册中的I/O library section,看看还有什么。
为什么要重新路由输出?你说你想以某种方式操纵它,但是你的意思是什么?