【问题标题】:Lua os.execute() does not workLua os.execute() 不起作用
【发布时间】:2012-10-27 13:06:12
【问题描述】:

我在使用 Lua os.execute() 命令时遇到问题。

我只想回显一个单词并将其写入文件,例如 echo 'aword' > C:\folder\tempworkspace\foo 以尝试 os.execute() 命令。目录 C:\folder\tempworkspace 存在,“foo”是我希望命令创建并填充“aword”的文件的名称。 稍后,当这工作时,我想使用R -q -e "rbinom(1000,1,0.7)" > C:\folder\tempworkspace\foo 调用 R。

我已经尝试了所有提供的建议 Lua programming - os.execute() is not working in WindowsWhy won't applications in Program Files run using os.execute in lua? 但我的问题似乎是另一个问题,甚至可能不在语法上,而是在其他地方?

当我直接在命令提示符中键入这些命令时,它们会起作用。我以管理员身份使用 Windows 7 Professional,并使用带有 Eclipse 的 Lua 5.1.4。

这是我迄今为止尝试过的:

os.execute("echo 'hehe' > C:\folder\tempworkspace\foo")
os.execute [["echo 'hehe' > C:\folder\tempworkspace\foo"]]
os.execute [["echo 'hehe' > 'C:\folder\tempworkspace\foo'"]]
os.execute [[echo 'hehe' > C:\folder\tempworkspace\foo]]
os.execute [[echo 'hehe' > C:\\folder\\tempworkspace\\foo]]
os.execute[[cmd.exe /c echo 'hehe' > C:\folder\tempworkspace\foo]]
os.execute("cmd.exe /c echo 'hehe' > C:\\folder\\tempworkspace\\foo")
os.execute("cmd.exe /c echo 'hehe' > 'C:\\folder\\tempworkspace\\foo'")

如果您有任何改进我的代码的建议,我将不胜感激。 (注意:我正在写入文件,因为我想稍后在 lua 中使用输出。另一种方法是使用 io.popen() 已在某处提出,但据说它依赖于平台,无论如何我的当我尝试使用 x = io.popen("R -q -e 'rnorm(10)'") 时 Lua 崩溃。

在第一次回答后编辑:

您的 sendMsg 功能在我的计算机上也无法正常工作,而且我没有收到任何错误,我真的想知道是什么问题。对于 pcall,我这样做对吗?由于print(err) 行没有打印任何内容,我想知道我是否做得正确。

function sendMsg(cmd, msg, fpath)
  local output = cmd.. " ".. msg.. " > ".. fpath
  print(output)
  os.execute(output)
end
function sendMsgArgs()
  sendMsg("echo", "huhu", "C:\\merret\\tempworkspace\\foo");
end
err = pcall(sendMsgArgs) 
if err == true then
  print("THIS WORKED")
else
  print("THIS DID NOT WORK")
  print(err)
end

编辑:这实际上是一个 Eclipse/编辑器问题。所以想加一些标签,比如lua-eclipse,但是不能。

【问题讨论】:

  • 从您尝试的 8 个 os.execute(...) 命令的第一个列表中,实际上第 2、4、5、6 和 7 行的版本可以在我的计算机上运行!你确定你对目录有写权限吗?
  • 这很有趣。当我从普通命令提示符执行相同的命令时,它们会起作用。我也是管理员。所以我想我有写权限。但我会错吗?通过 Lua 执行命令时,写访问权限会有所不同吗?我怎样才能找到/改变这个?你知道吗?那会很有帮助!
  • pcall() 返回 2 个值,一个布尔值和一个错误字符串(如果发生错误)。因此,如果 result 为假,请将您的第二个 sn-p 更改为 local result, error = pcall(sendMsgArgs)print(error)。这可能会告诉你出了什么问题。

标签: eclipse lua command-prompt


【解决方案1】:

已经有一段时间了,但最后(感谢一位同事),我发现问题不在于 Lua 代码,而实际上是从 Eclipse 执行 Lua(我使用的是 Lua Eclipse 插件)。

用代码执行一个lua文件

x = os.execute('R -q -e rnorm(10) > C:/folder/something/foo') 
print(x)

从命令提示符或使用 Crimson 编辑器(见下文),它运行良好,并返回状态代码 0(而不是从 Eclipse 执行时的 -1)。

无论如何,非常感谢所有帮助者! 那个东西

PS:对于任何感兴趣的人,我正在使用 Lua 作为 TerraME 环境的一部分,http://www.terrame.org/doku.php。那里还有如何使用 Crimson Editor 的说明。

【讨论】:

  • 我遇到了类似的问题。我在另一个 ide 中运行完全相同的代码,它工作正常。如果我在命令提示符下运行完全相同的命令行,它可以工作,但如果我在 Eclipse 项目中运行,它就不起作用!!! ;/ 你有没有取得任何进展?
【解决方案2】:

这段代码在我的 Win7 机器上运行:

function sendMsg(cmd, msg, fpath)
    local output = cmd.. " ".. msg.. " > ".. fpath
    print(output)
    os.execute(output)
end

sendMsg("echo", "hehe", "C:\\path\\to\\foo");

在尝试写入文件之前,您需要确保文件存在。你是从 lua 解释器运行这个吗?当写入失败时,您会收到任何错误消息吗?

或者-您可以使用 io.open() 并以这种方式编写。如果您在打开/读取该位置时遇到某种窗口问题,则将其包装在一个函数中并使用 pcall() 调用它可能会为您提供更多信息。

local fout = io.open("C:\\path\\to\\foo", "w+")
fout:write("hehe")
fout:close()

使用 pcall 的示例:

local result, error = pcall(sendMsg, "echo", "huhu", "C:\\merret\\tempworkspace\\foo")
if result == false then
    print(error)
else
    print("success!")
end 

【讨论】:

  • 感谢您的快速答复!
  • 感谢您的快速答复! fout = io.open(...) 有效,但稍后我将不得不从命令行运行 R 命令(例如 R -q -e "rbinom(1000,1,0.7)" > C:\folder\tempworkspace\foo)并将它们的结果打印到文件中,所以如果我没有弄错的话,这对我没有帮助。您的 sendMsg 功能在我的计算机上也无法正常工作,或者我没有正确执行,我将在我最初的问题下发布我的代码(这个评论不够大,它不是真正的答案......我'我仍然是 Stackoverflow 新手)。
【解决方案3】:

如果您要写入的路径包含空格,则在 Windows 下必须用双引号括起来;单引号会报错。

因此,以下对我来说很好:

os.execute([[ echo test > "C:\\Program Files\\xyz.txt" ]])

【讨论】:

  • 但是对于大多数 Win7 或更高版本的用户来说,使用默认 ACL 尝试在 \Program Files 上写入应该会失败。像这样嵌套在os.execute 中,故障可能很难诊断。
  • 感谢您的建议。我确实尝试使用不包含任何空格的文件路径,以避免该问题...
猜你喜欢
  • 2011-06-27
  • 1970-01-01
  • 2012-03-29
  • 2012-12-13
  • 1970-01-01
  • 2014-02-11
  • 2010-09-13
  • 2015-05-17
  • 1970-01-01
相关资源
最近更新 更多