我正在使用Redhawk 1.9。我已经从1.8.4 IDE创建了一个Redhawk设备。
我将默认的1.8.4设备导入1.9 IDE。我能够在1.9 IDE中运行和构建1.8.4设备。当我尝试重新生成1.8.4设备的代码时,IDE会问我是否要升级到1.9。弹出窗口显示“ConversionTestDevice使用已弃用的代码生成器。您是否要升级此项目?”。我决定升级一下。然后,我收到以下错误消息:
/ usr / local / redhawk / core / bin / update_project返回错误代码1
追踪(最近一次通话): 文件“/ usr / local / redhawk / core / bin / update_project”,第222行,在? 如果check_bulkio_input(compCpp): 在check_bulkio_input中输入文件“/ usr / local / redhawk / core / bin / update_project”,第105行 for strip_comments中的行(open(filename,'r')): strip_comments中的文件“/ usr / local / redhawk / core / bin / update_project”,第86行 ch + = safe_next(chars) 在safe_next中输入文件“/ usr / local / redhawk / core / bin / update_project”,第56行 返回下一个(项目) NameError:未定义全局名称“next”
我很感激有关如何将1.8.4设备转换为1.9设备的建议。
答案 0 :(得分:0)
根据您的错误消息“NameError:global name'next'未定义”以及update_project python脚本1.9.0版本的内容,我假设您运行的是低于2.6的python版本。下一个函数是在Python 2.6(http://docs.python.org/2/library/functions.html#next)中引入的python内置函数。这是升级脚本中的已知错误,因为它应该与Python 2.4以及Python 2.6(分别在CentOS 5和6中的默认python安装)兼容。要解决此问题,您可以修改位于$ OSSIEHOME / bin / update_project中的update_project脚本并定义以下函数:
if not hasattr(__builtins__, 'next'):
# Python 2.4 does not have a free-standing next() function
def next(iterator, default):
"""
Backwards compatibility next() equivalent for Python 2.4.
"""
try:
return iterator.next()
except StopIteration:
return default
然后您应该删除先前定义的“safe_next”函数。
最后,您需要通过调用新实现的next函数替换对“safe_next”的两个调用,并添加第二个空字符串参数''
为清楚起见,具有这些更改的update_project的差异如下:
@@ -46,16 +46,16 @@ Options:
_bulkio_re = re.compile('BULKIO_data[A-Za-z]+_In_i')
-def safe_next(item):
- """
- Returns the next value of the iterator, or an empty string if the end of
- iteration has been reached. Allows string processing to gracefully handle
- the end of a line without explicit catch statements.
- """
- try:
- return next(item)
- except StopIteration:
- return ''
+if not hasattr(__builtins__, 'next'):
+ # Python 2.4 does not have a free-standing next() function
+ def next(iterator, default):
+ """
+ Backwards compatibility next() equivalent for Python 2.4.
+ """
+ try:
+ return iterator.next()
+ except StopIteration:
+ return default
def strip_comments(source):
"""
@@ -75,7 +75,7 @@ def strip_comments(source):
# Look for end comment token; if the end of the line is reached
# ch will be an empty string
while ch == '*':
- ch = safe_next(chars)
+ ch = next(chars, '')
if ch == '/':
inComment = False
break
@@ -83,7 +83,7 @@ def strip_comments(source):
if ch == '/':
# Read the next character to see if it matches a comment token
# (if it does not, both characters will be added to the output)
- ch += safe_next(chars)
+ ch += next(chars, '')
if ch == '/*':
# Comment, start discarding
inComment = True