我发现neo4j-bolt-driver
有一种奇怪的行为。当我使用Pycharm
来运行我的代码时,它运行得非常好,对neo4j
的单个查询我收到以下回复:
type: neo4j.node # I pulled out the type of the element.
<Node id=3820 labels={'city'} properties={'ID': 'xddy', 'name': 'california'}>
现在当我打包我的代码并从中创建.egg
,然后使用终端运行脚本以获得相同数据库的相同输入时,我得到以下响应:
type: neo4j.node # I pulled out the type of the element.
(_3820:city {ID: 'xddy', name: 'california'})
现在看一下响应的差异,类型只是缺少对象的keys
。
这会导致
AttributeError
。更糟糕的是我必须手动将数据解析为dict,以便我可以处理它。
副作用:
try:
props = node[admin].properties
node_chain[list(node[admin].labels)[0]] = props
address.append(props['name'])
except AttributeError:
# try to convert (_3820:city {ID: 'xddy', name: 'california'})
# to {'ID': 'xddy', 'name': 'california'}
# and add it to an existing dict with the key `city`
string_rep = str(node[admin])
splitted = string_rep.split('{')
label = splitted[0].split(':')[-1].strip()
payload_string = "{ " + splitted[1][:-1]
clean = payload_string.replace("'", " ").replace(":", "':'").replace(",", "','")\
.replace("{", "{'").replace("}", "'}")
temp_dict = ast.literal_eval(clean)
payload_dict = {k.strip(): v.strip() for k, v in temp_dict.items()}
address.append(payload_dict['name'])
node_chain[label] = payload_dict
我正在寻找两个答案:
egg
答案 0 :(得分:1)
您的执行环境存在差异。
即使您对shell执行和PyCharm项目解释器使用相同的虚拟环境,在执行.egg时,也可以修改执行环境以获取所有库的新副本,这些库不一定安装到“全局”模块路径(“global”在这里意味着在不使用virtualenv时系统范围内,或者在virtualenv的python模块中)。
你的PyCharm注意到它正在使用1.5.3
模块的版本neo4j-driver
,但pip引入你的.egg执行环境的版本是1.6.0a
,这是当时的最新版本依赖性解决方案。因此,当从shell执行它时,您使用的是neo4j-driver
的不同版本。
这本身并不会那么糟糕,但是......
目前neo4j-driver的1.5.3和1.6.0之间存在重大变化。
1.6.0改变了某些模块的路径,因此特定的导入可能会中断。它似乎也改变了一些数据对象的格式,正如您在示例中看到的那样。
起初看起来这只是使用版本的不稳定标签的结果,但这些更改很可能会保留,因为它是新版本。
要确保pip / setuptools安装相同版本,请固定版本号。
1.6.0在某些方面彻底改变了API。由于您是针对1.5.3进行开发的,因此您必须更改API以处理这两个版本(并且可能会在未来更新发布时再次破坏它),或者将其固定到特定版本。
要固定它,通过从构建目录中删除所有二进制文件来清除任何现有版本的neo4j-driver
,使用pip卸载它,然后更新您的setup.py
或其他依赖项管理工具以指向特定你正在开发的版本。
对于setup.py
,请将==1.5.3
添加到install_requires
,tests_require
或其他相关部分中图书馆名称的末尾。