使用setuptools打包含match case的Python项目编译失败求助
尝试用setuptools将含Python 3.10+ match-case语法的项目打包成.whl文件,执行python3 setup.py sdist bdist_wheel时失败,Cython编译过程无法识别match-case语法,触发CompileError。
代码示例
a = 10 match a: case 12: print('no') case _: print('yes')
错误信息
Error compiling Cython file: ------------------------------------------------------------ ... a = 10 match a: ^^^^^^^^^^^^^^^^^^^ xxx/xxx.py:153:10: Syntax error in simple statement list ------------------------------------------------------------ Traceback (most recent call last): File "/home/xxx/xxx/xxx-Segmentation/setup.py", line 17, in <module> ext_modules=cythonize([...]) ... Cython.Compiler.Errors.CompileError: xxx/xxx.py
环境信息
- Python版本:3.11.7
- Cython版本:3.0.10
- 操作系统:Linux Ubuntu 20.04.5
疑问
- 有人成功用Cython编译含
match-case的Python 3.10+代码吗?具体如何实现? - Cython或setuptools是否有特定配置或变通方案支持该语法构建?或有推荐的Python 3.10+特性适配构建策略?
针对问题1:可以成功编译,关键是指定Cython的Python语法版本
Cython 3.x已支持Python 3.10+的语法,只需明确告知Cython编译时使用对应版本的语法规则即可。
针对问题2:具体配置和变通方案
在setup.py中指定Python版本
在cythonize函数中添加language_level参数,明确设置为"3.10"或更高(比如匹配你的Python 3.11环境,设为"3.11"):from setuptools import setup from Cython.Build import cythonize setup( # ... 其他配置项 ext_modules=cythonize( ["your_module.py"], language_level="3.11" # 至少设为3.10以支持match-case ) )若项目需兼容多Python版本,也可设为
"3"让Cython自动适配当前环境版本,但明确指定3.10+更稳妥。确认Cython版本兼容性
你当前使用的Cython 3.0.10已支持match-case,但Cython 2.x完全不支持该语法,务必确保使用Cython 3.x系列版本。变通方案:跳过特定文件的Cython编译
若部分含match-case的文件仍无法被Cython正确解析,可将其排除在cythonize编译列表外,直接作为纯Python文件打包:from setuptools import setup, find_packages setup( # ... 其他配置项 packages=find_packages(), # 自动包含所有纯Python文件 ext_modules=cythonize(["your_other_modules.py"]), # 仅编译不含match-case的文件 )纯Python文件会直接打包,不经过Cython编译,自然保留
match-case语法。升级Cython到最新稳定版
尽管3.0.10支持match-case,但后续版本可能修复了语法解析的bug,执行pip install --upgrade cython升级到最新版可尝试解决潜在问题。
内容的提问来源于stack exchange,提问作者wingsofpanda

