python开发笔记

Dec 14, 2019


记录Python开发中的知识点


scapy


解析pcap文件存在的bug


使用tshark -w 生成filter过后的pcap文件,使用scapy解析时发现报系统内存不足的问题。明明是很小的pcap文件,不可能导致内存不足,单步调试后发现问题出在下面的blocklen的计算上:

class RawPcapNgReader(RawPcapReader):
"""A stateful pcapng reader. Each packet is returned as
bytes.

"""

alternative = RawPcapReader

PacketMetadata = collections.namedtuple("PacketMetadata",
                                        ["linktype", "tsresol",
                                         "tshigh", "tslow", "wirelen"])

def __init__(self, filename, fdesc, magic):
    self.filename = filename
    self.f = fdesc
    # A list of (linktype, snaplen, tsresol); will be populated by IDBs.
    self.interfaces = []
    self.default_options = {
        "tsresol": 1000000
    }
    self.blocktypes = {
        1: self.read_block_idb,
        2: self.read_block_pkt,
        3: self.read_block_spb,
        6: self.read_block_epb,
    }
    if magic != b"\x0a\x0d\x0d\x0a":  # PcapNg:
        raise Scapy_Exception(
            "Not a pcapng capture file (bad magic: %r)" % magic
        )
    # see https://github.com/pcapng/pcapng
    blocklen, magic = self.f.read(4), self.f.read(4)  # noqa: F841
    if magic == b"\x1a\x2b\x3c\x4d":
        self.endian = ">"
    elif magic == b"\x4d\x3c\x2b\x1a":
        self.endian = "<"
    else:
        raise Scapy_Exception("Not a pcapng capture file (bad magic)")
    self.f.read(12)
    #blocklen = struct.unpack("!I", blocklen)[0]
    blocklen = struct.unpack(self.endian + "I", blocklen)[0]

    # Read default options
    self.default_options = self.read_options(
        self.f.read(blocklen - 24)
    )
    try:
        self.f.seek(0)
    except Exception:
        pass

注释掉的是原来代码,修改后正常。


基于flask的开发

构建flask后台开发环境

docker部署flask + uwsgi + gevent实现websocket


完成demo工程参见github docker镜像 docker pull saiyn/websocket:v0.0.2

在实现demo的时候踩了一些坑,其他之一是uwsgi低于2.0.19的版本都不能和gevent新版本兼容,会出现这样的bug


virtulenv的运用


在基于venv开发和管理python依赖库时首先会碰到的就是venv的迁移问题,比如开始是在本地开发的,后面要上线到AWS。

  • 创建venv

    $python3 -m venv myvenv

    $cd myvenv

    $source bin/activate

    $pip install -r requirement.txt


sudo后提示无法找到python的问题


在执行source ./myenv/bin/activate后,这时我们执行python3 xxx.py运行代码是没有问题的,但是执行sudo python3 xx.py后就发现会报无法找到python的问题。

这是因为,在我们执行source ./myenv/bin/activate后,venv中的python路径会被添加到$PATH中去,但是,为了安全,sudo执行程序时,系统会忽略$PATH,所以导致无法定位python程序位置的问题。

解决方法之一就是,执行sudo ./myenv/bin/python3 xxx.py,显示的给出python所在路径。


安装uwsgi


在执行pip install uwsgi之前先要执行sudo apt-get install python3-dev,否则会出现”fatal error: Python.h: No such file or directory”的错误