我正在尝试编写一个lua脚本,用于读取其他进程的输入并对其进行分析。为此我使用io.popen并且它在Windows中按预期工作,但在Unix(Solaris)上读取io.popen块,因此脚本只是等到那里,直到出现某些东西而不是立即返回...
据我所知,我无法从脚本中更改io.popen的功能,如果可能,我宁愿不必更改C代码,因为那时脚本将需要被绑定用修补后的二进制文件。
这是否让我得到任何命令行解决方案?
答案 0 :(得分:1)
好的到目前为止没有答案,但对于子孙后代,如果有人需要类似的解决方案我或多或少做了以下
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
答案 1 :(得分:1)
您的问题似乎与缓冲有关。由于某种原因,管道在允许打开的程序向其写入更多内容之前等待读取一些数据,并且它似乎小于一行。你可以做的是使用io.popen(cmd):读“* a”来读取所有内容。这应该避免缓冲问题。然后你可以将返回的字符串拆分为string.gmatch中的for行(“[^ \ n] +”)do someting_with(line)end。
您的解决方案包括将进程的输出转储到文件中,然后读取该文件。你可以用io.execute替换你的use或io.popen,并丢弃返回值(只需检查它为0)。