【问题标题】:send lua output to non stdout将 lua 输出发送到非标准输出
【发布时间】:2012-08-11 01:17:16
【问题描述】:

我有一个运行嵌入式 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;
}

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

【问题讨论】:

  • 我过去做过。你需要修补 Lua 来实现这一点。你用的是什么版本?我的补丁适用于 Lua 5.1,但我也可以将其移植到 5.2。
  • 我使用的是 5.2。这真的不可能作为 C API 中的一个选项吗?
  • 你知道,除了完全重新路由stdout,我更愿意避免这种情况
  • 我的补丁是关于将输出函数重新定义为钩子,然后从应用程序或中间库设置这些函数,以便您可以使用自定义输出函数。
  • @AndrejsCainikovs 我不明白。我想避免将stdout 重新路由到自定义流,因为我使用stdout 进行调试,并且希望避免一直来回切换。你的补丁允许我这样做吗?

标签: c lua stdout


【解决方案1】:

如果您的 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

【讨论】:

  • 这似乎符合我的目标,但我需要知道如何将luaL_dofile() 的输出“返回”到@ C语言中的987654326@可以这样做吗?
  • Lua 脚本出现语法错误怎么办?如果你想在缓冲区而不是 stdout/stderr 上获取错误,你需要修补 Lua。
  • @ewok luaL_dofile() 不写入标准输出。 “输出”是什么意思?
  • @kikito,但luaL_dostring() 似乎。看看我的代码。该代码导致“你好世界!”写入控制台。我想要它在char*
  • @ewok 在这种情况下,您必须从 C 重新定义 print,以便它写入缓冲区。在此处查看 Mike M. 的答案:stackoverflow.com/questions/4508119/…
【解决方案2】:

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

按照承诺,我已将旧的 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

测试

获取测试程序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)
---

【讨论】:

    【解决方案3】:

    Lua 的 I/O 库可能涵盖了您正在寻找的内容。 io.output 函数允许您设置默认输出文件。查看 5.2 手册中的I/O library section,看看还有什么。

    为什么要重新路由输出?你说你想以某种方式操纵它,但你的意思是什么?

    【讨论】:

    • 目标是让输出 A) 显示在 gui 中,而不是控制台中,并且 B) 具有某些功能,在显示之前在 C 中完成计算
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    相关资源
    最近更新 更多