我有一个奇怪的情况:
class SomeClass(object):
def __init__(self, data):
self.data = {}
self.data = data
old_data_name = "SOURCE" # self.data[old_data_name] = a list of values
try:
self.data[old_data_name] = [1,2,3,4]
except Exception as e:
print(str(e))
new_data_name = "NEW" # a name
self.data[new_data_name] = numpy.mean(self.data[old_data_name])
因此,此代码在Windows上可以完美运行-我已按语句调试了该语句并进行了验证。
当我将代码部署到linux服务器上时。它给了我一个KeyError: old_data_name
我确定数据已经到了不会发生键错误的地步。 为什么python在Linux和Windows上的行为如此不同?
答案 0 :(得分:0)
我的第一印象是版本不匹配:
@Basic感谢Basic问题确实是版本不匹配。视觉效果 Windows上的Studio默认为3.6,Ubuntu强制3.5.2 知道只是一个很小的修订就有如此巨大的重大变化 来自python。好像一团糟。
但经过进一步调查。它显示版本python 3.5.2与3.6.6相比具有读取json文件的怪异方式 从本质上讲,我加载数据的方式意味着它自己引用了加载后的属性。例如:
{properties: {"stuff": "do this", "stuff2": "do another with @stuff" }}
我的代码在从不加载东西时在stuff2中寻找东西
Python版本3.5.2没有将json数据加载到字典的特定顺序,这会导致问题。
Python 3.6.6修复了此问题。
答案 1 :(得分:0)
您不应该在try-catch块之外通过old_data_name
从self.data
获取值,因为如果没有这样的键,您将打印错误,而不是尝试通过该键获取某些内容。这是不对的。您应该这样写:
class SomeClass(object):
def __init__(self, data):
self.data = {}
self.data = data
old_data_name = "SOURCE" # self.data[old_data_name] = a list of values
try:
self.data[old_data_name] = [1,2,3,4]
new_data_name = "NEW" # a name
self.data[new_data_name] = numpy.mean(self.data[old_data_name])
except Exception as e:
print(str(e))