我正在尝试编写一个从其他进程读取输入并对其进行分析的 lua 脚本。为此,我正在使用 io.popen 并且它在 Windows 中按预期工作,但在 Unix(Solaris)上从 io.popen 块读取,所以脚本只是在那里等待直到出现某些东西而不是立即返回......
据我所知,我无法从脚本中更改 io.popen 的功能,如果可能的话,我宁愿不必更改 C 代码,因为那样脚本将需要与修补后的绑定二进制。
这会给我留下任何命令行解决方案吗?
我正在尝试编写一个从其他进程读取输入并对其进行分析的 lua 脚本。为此,我正在使用 io.popen 并且它在 Windows 中按预期工作,但在 Unix(Solaris)上从 io.popen 块读取,所以脚本只是在那里等待直到出现某些东西而不是立即返回......
据我所知,我无法从脚本中更改 io.popen 的功能,如果可能的话,我宁愿不必更改 C 代码,因为那样脚本将需要与修补后的绑定二进制。
这会给我留下任何命令行解决方案吗?
好的,到目前为止还没有答案,但是对于后代,如果有人需要类似的解决方案,我或多或少做了以下事情
function my_popen(name,cmd)
local process = {}
process.__proc = assert(io.popen(cmd..">"..name..".tmp", 'r'))
process.__file = assert(io.open(name..".tmp", 'r'))
process.lines = function(self)
return self.__file:lines()
end
process.close = function(self)
self.__proc:close()
self.__file:close()
end
return process
end
proc = my_popen("somename","some command")
while true
--do stuf
for line in proc:lines() do
print(line)
end
--do stuf
end
您的问题似乎与缓冲有关。由于某种原因,管道在允许打开的程序向其写入更多内容之前正在等待读取一些数据,并且它似乎不到一行。您可以做的是使用 io.popen(cmd):read"*a" 来读取所有内容。这应该避免缓冲问题。然后你可以用 for line in string.gmatch("[^\n]+") do someting_with(line) end 分割返回的字符串。
您的解决方案包括将进程的输出转储到文件中,然后读取该文件。您可以将您的 use 或 io.popen 替换为 io.execute,并丢弃返回值(只需检查它是否为 0)。