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)
有个功能需要依次执行上述三个函数,每个都用单独的异常捕获,结果总是出现超时的错误,把三个函数放在一个try代码块中解决,原因不明,有待查找具体原因。

二 串口相关:

使用串口通信,导入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'

记得昨天还正常,今天怎么就异常了?然后就一通搜,把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
 

2 串口收到的数据不是字符串 b"b'hello\\r\\n'"

Python3的字符串的编码语言用的是unicode编码,由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干字节,如果要在网络上传输,或保存在磁盘上就需要把str变成以字节为单位的bytes

解决方法就是转换一下格式 :data=str(data,'UTF-8')

posted @ 2021-04-15 13:43  LevinKai  阅读(174)  评论(0编辑  收藏  举报