V-REP';在Linux上,s Lua`tonumber`返回nil
我们开发了一个简单的模拟,它在OSX上运行得很好,但在Linux(Ubuntu 15.04)上没有。被用作主要的脚本语言 我们附加以下代码(返回值在注释中),不幸的是在Linux上返回V-REP';在Linux上,s Lua`tonumber`返回nil,lua,type-conversion,multiplatform,Lua,Type Conversion,Multiplatform,我们开发了一个简单的模拟,它在OSX上运行得很好,但在Linux(Ubuntu 15.04)上没有。被用作主要的脚本语言 我们附加以下代码(返回值在注释中),不幸的是在Linux上返回nil(但在OS X上将e[3]转换为数字而没有问题): 真正有趣的是,前面的代码在Lua5.2.3控制台(OSX和Linux)中都能正常工作。但是,在Linux上运行时,V-REP无法将字符串正确地转换为数字 我们尝试了这两种方法(今天下载),结果完全相同-nils。你能指出一些我们遗漏的东西吗?Lua和V-RE
nil
(但在OS X上将e[3]
转换为数字而没有问题):
真正有趣的是,前面的代码在Lua5.2.3控制台(OSX和Linux)中都能正常工作。但是,在Linux上运行时,V-REP无法将字符串正确地转换为数字
我们尝试了这两种方法(今天下载),结果完全相同-nil
s。你能指出一些我们遗漏的东西吗?Lua和V-REP都不是我们每天使用的UTIL
编辑1:
我使用Ubuntu 15.04。V-REP使用Lua 5.1,我的Lua版本:
$ apt-cache policy lua5.1
lua5.1:
Installed: 5.1.5-7.1
Candidate: 5.1.5-7.1
Version table:
*** 5.1.5-7.1 0
500 http://cz.archive.ubuntu.com/ubuntu/ vivid/main amd64 Packages
100 /var/lib/dpkg/status
在console中,我尝试了以下操作:
$ lua
Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio
> e={[3]="-0.677782532263"}; print(e[3], type(e[3]), tonumber(e[3]), type(tonumber(e[3])))
-0.677782532263 string -0.677782532263 number
软件包这个错误是由V-REP使用Lua5.1这一事实造成的,我们测试它的计算机有不同的数字区域设置(linux有
LC\u NUMERIC=cs\u CZ.UTF-8
,mac可能有en\u US
)
这意味着Mac上的Lua将字符串中的浮点数识别为数字,但具有不同语言环境的Linux上的Lua没有——它没有一个逗号(例如,-3513
)作为语言环境所需的十进制分隔符,因此在转换时返回nil
修复方法是在将vrep运行到en\u US
区域设置之前设置LC\u NUMERIC
标志,如下所示:
...$ LC_NUMERIC=en_US.UTF-8 ./vrep
这将强制区域设置为基于点的,并使Lua能够识别数字
感谢@Etan提供的所有帮助,并从正确的方向指出了这个问题。从lua代码中设置语言环境的另一种方法,如os.setlocale(“C”) 并非所有系统都可以在启动时更改任意应用程序的区域设置,有时需要更改整个系统的区域设置,这可能会给其他应用程序带来不便。如果使用V-REP分发的脚本以与XML文件相同的方式分发,其中分隔符是句点,而不是逗号,那么在调用tonumber函数之前,应该通过开放环境的变量从LUA而不是外部安装正确的控制台是合乎逻辑的 LUA文档清楚地描述了os.setLocale函数的用途,并且清楚地说明了它会影响字符串到数字的转换。在调用转换函数之前,需要确保设置正确
此外,更改自身区域设置的脚本更具可移植性,因为它不需要启动人员知道应该从外部为V-REP指定哪些环境变量。您真的打印出了
Nil
吗?还是nil
?发生这种情况时,您确定在OS X和linux上使用的是相同版本的lua吗?当这种情况发生时,前两行在OS X和linux上都输出相同的值?Hello Etan,我们得到的是nil
,在两种平台上的版本都是相同的,关于输出-这些值是在python中动态创建的,并通过远程api发送到vrep(和lua),因此它们不是完全相同的值,但是这个错误在os x上根本不会发生,在linux上所有传入的浮点数都会发生。@EtanReisner这和Gyfis写的一模一样。如果你尝试print(“%q”):format(e[3])
,你会得到e[3]
的值是多少?这是linux的哪个发行版?什么样的包装?如果您手动尝试,您能在lua本身(没有vrep)中使用该值吗?(即e={[3]=“-0.677782532263”};打印(e[3],键入(e[3]),tonumber(e[3])
?)@EtanReisner请查看我的编辑1和答案。它似乎在控制台中工作,就像一个符咒。感谢您的伟大解决方案!好吧,据我所知,公认的答案确实将区域设置作为解决方案。所以它还没有完全关闭。不过,就目前情况而言,这个答案并不是很有用。我建议对评论进行大量编辑或转换。
...$ LC_NUMERIC=en_US.UTF-8 ./vrep