【问题标题】:Lua redirect stdout to console windowLua 将标准输出重定向到控制台窗口
【发布时间】:2014-10-04 23:52:49
【问题描述】:

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

所以我想打开一个控制台窗口并将 print() 重定向到它。我希望这样的事情能够奏效:

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

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

在 Windows 7 上使用 lua 5.1

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

【问题讨论】:

    标签: lua popen


    【解决方案1】:

    我想通了,要在 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 用于发布解决方案,很高兴您知道了!
    • 在带有 luaJIT 2.0 的 Windows 10 上似乎不适合我。没有控制台出现。
    【解决方案2】:

    你必须将数据写入管道:

    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
    

    【讨论】:

    • 这是有道理的,如果io.stdout 不可写,它可能是被垃圾收集的管道。但是,控制台窗口仍会立即关闭。我想可能是find 是一个内部命令,所以我尝试了io.popen('cmd /d /c find /v ""', "w"),但这并没有什么不同。从命令提示符运行echo hello | cmd /d /c find /v "" 工作正常,所以不应该是管道没有占用。
    • 您为什么希望控制台在pipe:write 之后保持打开状态?
    • 因为我的脚本继续运行并且我需要多次写入,而我写入管道的文本永远不会出现并且如果控制台立即关闭则无法读取。也许我应该澄清一下:我的脚本是一个需要几分钟的安装脚本,并且考虑到我的脚本运行时主机程序冻结,我需要某种输出来向用户保证一切都在正常运行.
    • 所以你的意思是find命令需要很长时间,你想让用户知道find仍然在运行的定期间隔?
    • Nonono,我正在尝试使用find 将我的脚本的输出(当我输出它时,因为它包含调试消息和状态更新)写入控制台窗口。我没有控制台(或其他任何东西)来为用户提供可见的输出,所以我试图产生一个我可以输出到使用io.popenfind 似乎很合适,如:1:它接受管道输入 2:输出到控制台窗口 3:可以设置为输出我发送的所有内容,就像我发送它一样。
    猜你喜欢
    • 2015-02-11
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2023-04-09
    相关资源
    最近更新 更多