使用Neomodel+Neo4j Aura时Python关闭阶段Bolt异常问题排查
问题:Python 3.10 + Neomodel + Neo4j Aura 出现
sys.meta_path is None 退出异常 使用Python 3.10、Neomodel连接Neo4j Aura时,数据已成功保存到数据库,但控制台抛出以下异常:
ImportError: sys.meta_path is None, Python is likely shutting down Exception ignored in: <function Bolt.__del__ at 0x7f1fe64679a0>
完整报错信息:
Exception ignored in: <function Driver.__del__ at 0x7f1fe649e440> Traceback (most recent call last): File ".local/lib/python3.10/site-packages/neo4j/_sync/driver.py", line 411, in __del__ File ".local/lib/python3.10/site-packages/neo4j/_sync/driver.py", line 456, in close File ".local/lib/python3.10/site-packages/neo4j/_sync/io/_pool.py", line 367, in close File ".local/lib/python3.10/site-packages/neo4j/_sync/io/_pool.py", line 320, in _close_connections File ".local/lib/python3.10/site-packages/neo4j/_sync/io/_bolt.py", line 757, in close File ".local/lib/python3.10/site-packages/neo4j/_sync/io/_bolt.py", line 609, in _send_all File ".local/lib/python3.10/site-packages/neo4j/_sync/io/_common.py", line 145, in flush File ".local/lib/python3.10/site-packages/neo4j/_async_compat/util.py", line 113, in callback File ".local/lib/python3.10/site-packages/neo4j/_sync/io/_bolt.py", line 688, in _set_defunct_write File ".local/lib/python3.10/site-packages/neo4j/_sync/io/_bolt.py", line 691, in _set_defunct ImportError: sys.meta_path is None, Python is likely shutting down Exception ignored in: <function Bolt.__del__ at 0x7f1fe64679a0> Traceback (most recent call last): File ".local/lib/python3.10/site-packages/neo4j/_sync/io/_bolt.py", line 161, in __del__ File ".local/lib/python3.10/site-packages/neo4j/_sync/io/_bolt.py", line 757, in close File ".local/lib/python3.10/site-packages/neo4j/_sync/io/_bolt.py", line 609, in _send_all File ".local/lib/python3.10/site-packages/neo4j/_sync/io/_common.py", line 145, in flush File ".local/lib/python3.10/site-packages/neo4j/_async_compat/util.py", line 113, in callback File ".local/lib/python3.10/site-packages/neo4j/_sync/io/_bolt.py", line 688, in _set_defunct_write File ".local/lib/python3.10/site-packages/neo4j/_sync/io/_bolt.py", line 691, in _set_defunct ImportError: sys.meta_path is None, Python is likely shutting down Process finished with exit code 0
用户代码:
from neomodel import (config, StructuredNode, StringProperty, IntegerProperty, UniqueIdProperty) user = 'neo4j' psw = 'test' uri = 'test.databases.neo4j.io' config.DATABASE_URL = 'neo4j+s://{}:{}@{}'.format(user, psw, uri) class Person(StructuredNode): uid = UniqueIdProperty() name = StringProperty(unique_index=True) age = IntegerProperty(index=True, default=0) if __name__ == "__main__": jim = Person(name='Jisdm', age=3).save() # Create jim.name = "adasd" jim.save() # Update, (with validation)
原因分析
这个异常是Python进程退出阶段触发的:业务逻辑已经执行完成(数据成功保存),但Neo4j驱动的__del__析构函数在Python进入shutdown状态后才尝试关闭连接。此时Python已经将sys.meta_path置为None,驱动内部执行清理操作时尝试访问导入相关逻辑,就会抛出这个错误。
解决办法
- 手动关闭驱动连接:在代码末尾主动获取并关闭Neo4j驱动,避免依赖析构函数自动清理。修改后的代码如下:
from neomodel import (config, StructuredNode, StringProperty, IntegerProperty, UniqueIdProperty, db) user = 'neo4j' psw = 'test' uri = 'test.databases.neo4j.io' config.DATABASE_URL = 'neo4j+s://{}:{}@{}'.format(user, psw, uri) class Person(StructuredNode): uid = UniqueIdProperty() name = StringProperty(unique_index=True) age = IntegerProperty(index=True, default=0) if __name__ == "__main__": jim = Person(name='Jisdm', age=3).save() # Create jim.name = "adasd" jim.save() # Update, (with validation) # 主动关闭驱动 db.driver.close() - 升级依赖版本:部分旧版本的Neo4j驱动或Neomodel存在退出清理的bug,升级到最新稳定版可以解决问题。执行以下命令更新:
pip install --upgrade neomodel neo4j - 临时捕获异常(不推荐):如果无法升级或修改代码,可以添加全局异常捕获忽略这类析构函数异常,但这只是临时 workaround,可能掩盖其他问题。
内容的提问来源于stack exchange,提问作者Dzianis
相关产品推荐
相关产品推荐

