python踩坑记
python的优点是库比较全,尤其是图像处理相关的,我觉得它最大的缺点就是取消了大括号而采用严格的缩进形式,这会导致如果有一个函数逻辑比较多就变成了一坨有规则形状的翔。
因项目需要,我接手维护后续python程序并做后续开发,本文记录工作中遇到的一些相关问题及解决方法。
一 网络相关:
1.socket.recv()
是个阻塞式函数,用它来接收客户端发送的数据最好增加超时设置,否则会出现服务器无响应的情况。
socket.settimeout(20)
newbuf = sock.recv(count)
2.try except 异常捕获问题
sock.send(1)
sock.send(2)
sock.recv(1)
二 串口相关:
使用串口通信,导入serial包之后运行代码,一直提示如下错误:
pi@raspberrypi:~/RAIPS/python/prj $ sudo python my_uart.py
LINE 94 :INFO START
Traceback (most recent call last):
File "my_uart.py", line 95, in <module>
print_usb_info(com)
File "my_uart.py", line 74, in print_usb_info
for i in serial.tools.list_ports.comports():
AttributeError: module 'serial' has no attribute 'tools'
LINE 94 :INFO START
Traceback (most recent call last):
File "my_uart.py", line 95, in <module>
print_usb_info(com)
File "my_uart.py", line 74, in print_usb_info
for i in serial.tools.list_ports.comports():
AttributeError: module 'serial' has no attribute 'tools'
记得昨天还正常,今天怎么就异常了?然后就一通搜,把serial pyserial包装了卸,卸了装,重复无数次,最后甚至把python2卸载了,切换默认版本到python3还是不行,最后的最后发现了有个人脚本的写法与我不同,然后改了一下代码好了。
已经导入包了,再导入一次用到的class?什么鬼?
import serial
from serial.tools.list_ports import comports#加了这句就好了
三 其它
1 python获取shell命令执行结果
1 def lm_get_cmd_result(cmd): 2 content = os.popen(cmd).read() 3 print("cmd result:",content) 4 5 cmd = "lsusb" 6 lm_get_cmd_result(cmd)
执行结果:
cmd result: Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 044: ID 0bda:5847 Realtek Semiconductor Corp. Bus 001 Device 043: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter Bus 001 Device 042: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter Bus 001 Device 041: ID 214b:7250 Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
2 shell脚本中切换目录
无效,原因查了下说是shell脚本执行时子脚本继承了当前脚本的环境,使用 path = os.getcwd()获取到的路径时home路径,如果需要获取当前文件路径可以使用 base_dir = os.path.dirname(__file__)
=========================================
附一些指令:
卸载指令:pip uninstall pyserial
安装指令:sudo pip install pyserial
强制重装指令:sudo pip install --ignore-installed pyserial
切换版本指令:sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 150
pyserial文档:https://pythonhosted.org/pyserial/tools.html
https://pyserial.readthedocs.io/en/latest/tools.html
3 数据转换
1 字符串转整数出错
错误类型:
ValueError: invalid literal for int() with base 10:
原因:由于python不能直接将包含小数点的字符串转化为整数,而原始数据的格式经常是不一致的,故类型转化时造成ValueError异常。
解决方法:先将字符串转换为浮点数float,在将浮点数转化为整数int。
示例:
a=int(float(123.456))
————————————————
原文链接:https://blog.csdn.net/weixin_44034883/article/details/112918440
ValueError: invalid literal for int() with base 10:
原因:由于python不能直接将包含小数点的字符串转化为整数,而原始数据的格式经常是不一致的,故类型转化时造成ValueError异常。
解决方法:先将字符串转换为浮点数float,在将浮点数转化为整数int。
示例:
a=int(float(123.456))
————————————————
原文链接:https://blog.csdn.net/weixin_44034883/article/details/112918440
2 串口收到的数据不是字符串 b"b'hello\\r\\n'"
Python3的字符串的编码语言用的是unicode编码,由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干字节,如果要在网络上传输,或保存在磁盘上就需要把str变成以字节为单位的bytes
解决方法就是转换一下格式 :data=str(data,'UTF-8')
--------------
Now, Or Never.
--------------