python:导入库、模块失败

寻技术 Python编程 / React 2023年07月08日 124

一般发生在程序开始部分:
from pymodbus.client.sync import ModbusSerialClient
from pymodbus.payload import BinaryPayloadDecoder
from pymodbus.constants import Endian
from pymodbus.compat import iteritems
import time
import threading
import json
from device import Device
比如这一堆,运行时可能报错如下:
Traceback (most recent call last):
File "/home/pi/Car/sensor.py", line 87, in <module>
sensor = Sensor(device_id, queue_name)
File "/home/pi/Car/sensor.py", line 19, in __init__
self.client = ModbusSerialClient(
NameError: name 'ModbusSerialClient' is not defined
两种情况:
1.库更新了,你目前装的库里方法失效了,你的代码走的是老库的
2.循环引用了,Python中循环应用的情况就是程序分级不清晰,会导致如下问题:
内存泄漏:由于循环引用,对象无法被垃圾回收器正确地释放。即使这些对象不再被程序使用,它们仍然无法被回收,从而占用了内存空间,导致内存泄漏问题。
引用计数错误:Python 中使用引用计数来管理对象的生命周期,在循环引用情况下,引用计数的增加和减少会出现问题。对象之间持续相互引用时,它们的引用计数不会变为零,导致无法正确地释放内存。
程序性能下降:循环引用可能导致 Python 解释器在处理对象时出现性能下降。由于需要额外的开销来管理循环引用,垃圾回收器需要更多的时间和资源来解决循环引用的问题,从而降低了程序的性能。
针对以上两种情况:
1.更新库,
pip3 install pymodbus==2.5.5
这就是将库版本回溯到以前的老库版本了,不过有时候老库的资源被删除了,要么找离老库最近的版本,要么更新程序代码。
2.显式地将引用设置为 None:在不再需要对象之间的引用关系时,可以显式地将其设置为 None,以断开循环引用。
使用弱引用(Weak Reference):对于不需要持有对象所有权的引用,可以使用弱引用来避免循环引用。弱引用不会增加对象的引用计数,而且在对象被回收时,弱引用会自动失效。
重新设计数据结构:如果出现循环引用问题,可能需要重新设计数据结构,以避免对象之间的相互引用关系。

关闭

用微信“扫一扫”