• 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')

    -------------- Now, Or Never. --------------
  • 相关阅读:
    Hadoop学习笔记
    Hadoop学习笔记 -伪分布式
    SSH 连接报错总结
    Hadoop学习笔记
    Trie 前缀树/字典树
    解数独(Leetcode-37 / HDU-1426)/回溯/状态压缩
    MyBatis 多表关联查询
    python_37期自动化【lemon】
    api课堂笔记_day14
    api课堂笔记_day12&day13
  • 原文地址:https://www.cnblogs.com/levinkai/p/14662112.html
Copyright © 2020-2023  润新知