在Lambda中用Pydub+FFmpeg转OGG到MP3时遇无效转义序列警告
问题描述
在AWS Lambda环境中使用Pydub结合FFmpeg将OGG格式音频转换为MP3时,出现invalid escape sequence '('的语法警告。目前文件转换已成功完成并输出正确文件,但想咨询该警告是否需要处理,以及具体的解决方法。
执行代码
key = 'sample.ogg' input_bucket = 'all-formats-input-bucket' obj = s3.get_object(Bucket=input_bucket, Key=key) audio_data = obj['Body'].read() audio = AudioSegment.from_file(io.BytesIO(audio_data), format="ogg")
Pydub中触发警告的相关代码
for token in extra_info[stream['index']]: m = re.match('([su]([0-9]{1,2})p?) \(([0-9]{1,2}) bit\)$', token) m2 = re.match('([su]([0-9]{1,2})p?)( \(default\))?$', token) if m: set_property(stream, 'sample_fmt', m.group(1)) set_property(stream, 'bits_per_sample', int(m.group(2))) set_property(stream, 'bits_per_raw_sample', int(m.group(3))) elif m2: set_property(stream, 'sample_fmt', m2.group(1)) set_property(stream, 'bits_per_sample', int(m2.group(2))) set_property(stream, 'bits_per_raw_sample', int(m2.group(2))) elif re.match('(flt)p?( \(default\))?$', token): set_property(stream, 'sample_fmt', token) set_property(stream, 'bits_per_sample', 32) set_property(stream, 'bits_per_raw_sample', 32) elif re.match('(dbl)p?( \(default\))?$', token): set_property(stream, 'sample_fmt', token) set_property(stream, 'bits_per_sample', 64) set_property(stream, 'bits_per_raw_sample', 64) return info
完整警告输出
/opt/python/pydub/utils.py:292: SyntaxWarning: invalid escape sequence '\(' m = re.match("([su]([0-9]{1,2})p?) \(([0-9]{1,2}) bit\)$", token) /opt/python/pydub/utils.py:293: SyntaxWarning: invalid escape sequence '\(' m2 = re.match("([su]([0-9]{1,2})p?)( \(default\))?$", token) /opt/python/pydub/utils.py:302: SyntaxWarning: invalid escape sequence '\(' elif re.match("(flt)p?( \(default\))?$", token) /opt/python/pydub/utils.py:306: SyntaxWarning: invalid escape sequence '\(' elif re.match("(dbl)p?( \(default\))?$", token)
解答
是否需要处理?
这个警告不会影响当前转换功能的正常运行,旧版Python(3.7及以前)会兼容这种写法,但从Python 3.10开始,这类未正确转义的字符会触发SyntaxWarning。如果当前业务运行稳定,短时间内可以不用紧急处理,但从代码规范和未来版本兼容性角度,建议修复,避免后续Python版本升级后可能出现的语法错误。
具体解决方法
1. 升级Pydub到最新版本
官方通常会在新版本中修复这类语法问题,直接升级依赖即可。在Lambda的requirements.txt中指定最新版Pydub:
pydub>=0.25.1
2. 手动修改Pydub的utils.py文件
如果暂时无法升级,可以手动修改Lambda环境中/opt/python/pydub/utils.py里的正则表达式:
将所有涉及\(和\)的正则字符串改为原始字符串(在字符串前加r前缀),示例如下:
- 原代码:
re.match('([su]([0-9]{1,2})p?) \(([0-9]{1,2}) bit\)$', token) - 修改后:
re.match(r'([su]([0-9]{1,2})p?) \(([0-9]{1,2}) bit\)$', token)
同理,其他触发警告的正则也需要修改:
m2 = re.match(r'([su]([0-9]{1,2})p?)( \(default\))?$', token) # ... elif re.match(r'(flt)p?( \(default\))?$', token): # ... elif re.match(r'(dbl)p?( \(default\))?$', token):
3. 降级Lambda Python运行时(不推荐)
将Lambda的Python运行时版本降到3.9或更低,这类警告就不会触发,但这只是临时规避,不利于长期维护和版本升级,不建议采用。
内容的提问来源于stack exchange,提问作者user19953380
相关产品推荐
相关产品推荐

