Lua将stdout重定向到控制台窗口

时间:2014-10-04 23:52:49

标签: lua popen

我正在尝试编写一个需要向用户显示消息的lua脚本,当然主机应用程序仅提供有限的支持。

所以我想打开一个控制台窗口并将print()重定向到它。我期待这样的事情能发挥作用:

io.stdout = io.popen('find /v ""', "w")
print("It works!")

但控制台窗口立即关闭,而不是等待来自管道的输入。

在Windows 7上使用lua 5.1

编辑:我注意到管道关闭时find命令终止。可能是它没有从管道读取,或管道过早关闭?

2 个答案:

答案 0 :(得分:2)

我想通了,在Windows上打开一个输出控制台,这可行:

local out = io.popen('find /v "" > con', "w")
function print(s)
  out:write(s.."\r\n") --\r because windows
  out:flush()
end
print("It really works this time!")

find命令似乎提前终止,因为它没有指定的stdout;在最后提供> con告诉它将stdout设置到控制台,并使控制台保持打开状态。

答案 1 :(得分:1)

您必须将数据写入管道:

pipe = io.popen('find /v ""', "w")
pipe:write("It works!")

文档中没有任何迹象表明io.stdout可以重置为指向其他文件句柄。事实上,有些帖子指出print直接拨打fputs,而不是io.stdout。您可能最好将print指向管道的编写器方法

old_print = print
print = function(...) pipe:write(...) end

然后在执行上述操作后对print的任何调用将转到管道。理想情况下,一旦脚本结束,您应该将print恢复到原来的状态:

print = old_print