如何在Lua中将标准输出重定向到文件?

5

我正在尝试将 Lua (5.1) 的 stdout 重定向到文件而非控制台。

有一个第三方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

有没有办法将函数的输出强制写入文件,或者将所有标准输出强制写入文件而不是控制台?谢谢。

2个回答

3

您需要使用io.write 方法代替print。它的工作方式类似,但不使用制表符分隔参数。io.write 会尊重io.output,而print 则不会。


1
实际的打印是在第三方API函数内部完成的,我无法更改 - 所以这对我没有帮助 :/(但知道这一点还是很好的)。 - cwbit
4
这是一个不同的问题。如果API函数仍然使用全局的 print 函数(而不是它的C API等价物),你可以用自己的 print 进行替换:print = function(...) io.write(table.concat({...}, "\t")) end。如果它正在使用C API,我认为没有办法重定向或 monkeypatch 它。有关详细信息,请参见此线程:http://lua-users.org/lists/lua-l/2012-11/msg00125.html。 - Paul Kulchenko
在ComputerCraft中有一个fs API。 如果我没记错的话,它的使用方式如下: foo = fs.open("foo", "w") foo.writeLine("testing. 1, 2, 3") foo.close() - CHlM3RA

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

2
仅提供代码的答案被认为是低质量的:请确保提供解释您的代码是如何解决问题的。如果您在帖子中添加更多信息,将有助于提问者和未来的读者。请参阅解释完全基于代码的答案 - Calos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接