【问题标题】:How to redirect stdout to file in Lua?如何将标准输出重定向到 Lua 中的文件?
【发布时间】:2020-03-10 06:48:08
【问题描述】:

我正在尝试将 Lua (5.1) 中的标准输出重定向到文件而不是控制台。

有一个第三方 API(我无法修改)包含一个打印出一组序列化数据的函数(我不知道打印的是哪个函数,假设是某种 print())

这些数据过于冗长,无法显示在我必须使用的屏幕上(无法滚动),因此我希望将函数的输出定向到文件而不是控制台。

我没有能力修补或操作 Lua 版本。

我的想法是使用文档记录不佳的 io.output() 文件将 stdout 更改为文件,但这似乎根本不起作用。

 io.output("foo")   -- creates file "foo", should set stdout to "foo"?
 print("testing. 1, 2, 3") -- should print into "foo", goes to console instead

有没有人知道有什么方法可以强制将函数输出到文件中,或者强制所有标准输出到文件而不是控制台? TIA。

【问题讨论】:

    标签: lua stdout computercraft


    【解决方案1】:

    您需要使用io.write 方法而不是print。它以类似的方式工作,但不使用选项卡分隔参数。 io.write 尊重 io.output,但 print 不尊重。

    【讨论】:

    • 实际打印是从第 3 方 API 函数内部完成的,我无法更改 - 所以这无济于事:/(但很高兴知道其他情况)。
    • 这是一个不同的问题;)。如果 API 函数仍然使用全局 print 函数(而不是其 C API 等效函数),您可以用自己的 print 替换:print = function(...) io.write(table.concat({...}, "\t") end。如果它使用 C API,我认为没有办法重定向或猴子补丁。详情见本帖:lua-users.org/lists/lua-l/2012-11/msg00125.html
    • 计算机技术中有一个 fs API。如果我没记错的话,它的用法是:foo = fs.open("foo", "w")foo.writeLine("testing. 1, 2, 3")foo.close()
    【解决方案2】:
    -- save, might need to restore later
    real_stdout = io.stdout
    
    file = io.open ('stdout.log', 'w')
    io.stdout = file
    
    .... -- call external API
    
    -- restore
    io.stdout = real_stdout
    

    【讨论】:

    • 仅代码的答案被认为是低质量的:请务必说明您的代码的作用以及它如何解决问题。如果您可以在帖子中添加更多信息,它将帮助提问者和未来的读者。请参阅[解释完全基于代码的答案](meta.stackexchange.com/questions/114762/)。
    猜你喜欢
    • 1970-01-01
    • 2010-09-29
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多