记录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”的错误