当我们执行Python代码的时候, 可能会遇到如下Warning
/tmp/ibd2sql/ibd2sql-main/ibd2sql/innodb_type.py:62: DeprecationWarning: invalid escape sequence '\('
这个告警很简单, 就是说无效的转义序列
, 也就是代码里面的反斜杠(\)
有问题,但不得(毕竟是告警)
这个报错我之前没遇到过, 因为我的环境是linux和windows, 而这个报错是在MACOS上见到的, 那我们没得macos的咋复现呢?
既然是Python的Warning, 那么python就有显示所有Warning的参数, 我们使用python --help
果然查询到了参数是 -W
那我们可以准备如下代码来复现
import re
aa = re.compile('char\((.+)\)').findall('x')
然后执行的时候加上 -Wall
即可
python3 -Wall t20241217.py
解决办法也很简单,
比如
re.compile('char\((.+)\)').findall('x')
修改为 re.compile(r'char\((.+)\)').findall('x')
虽然这个方法不如方法1, 但也不是不行. 即re.compile('char\\((.+)\\)').findall('x')
还有个神奇的现象, 就是第一次跑有这个Warning, 什么也不做, 直接跑第二次, 就没得了.... 为了方便演示, 我们直接使用for循环演示
for i in {1..2}; do python3 -Wall main.py /tmp/t1.ibd --sql --limit 1;done
我们看到 只有第一次出现了转义告警, 第二次就没了? 为啥呢?
--------------------------------- 分割线 -----------------------------------------------------------------------------
python执行代码的时候会在__pycache__目录下生成对应的pyc文件, 就是python字节码文件, 这样后面执行的时候只需要看下时间戳是否能对上, 对上的话, 就没必要再转字节码了. 而这个warning是转字节码的时候告警的, 而不是执行阶段告警的.
直接执行的话, 不会生成pyc字节码, 因为Python会认为你只是偶尔执行, 没必要保存. 我们使用import即可.(都调包了,python就给我们把字节码保存起来了)
而我们直接执行pyc代码, 也没有相关告警, 就证明这个告警只是在生成字节码的阶段才会有.
python执行的时候先转换为字节码, 转换的时候会有一些告警,尤其是正则表达式出现转义时, 我们可以使用real模式(r'str')来处理这个问题. 通常只有macos才有, linux和win通常不会有对应的告警, 要模拟的话, 可以加个 -Wall 来模拟.
由于是在转字节码阶段产生的告警, 所以通常只有文件被修改(时间戳变化)时才能遇到.
啊, 又水了一篇.
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。