Python脚本经Cython编译后运行报TypeError,求解决方案
解决Typer脚本Cython编译的两类问题
一、消除language_level未设置的FutureWarning
直接在Cython编译阶段指定Python语言级别,有两种方式:
- 编译命令中添加参数:
cython main.py --embed -3 - 在Python脚本开头添加Cython专用注释:
# cython: language_level=3
二、修复二进制运行时的TypeError: Expected str, got ArgumentInfo
该报错源于Cython静态类型处理与Typer的Argument装饰器返回值不兼容,可通过以下方案解决:
方案1:调整Typer参数写法
移除变量的类型注解,转而在Argument内指定类型:
key_id = typer.Argument(None, type=str)
方案2:使用字符串形式的类型注解
保留类型注解但改用字符串格式,绕过Cython的静态类型检查:
key_id: 'str' = typer.Argument(None)
方案3:修改Cython编译配置
通过setup.py禁用严格类型检查,示例配置如下:
from setuptools import setup from Cython.Build import cythonize setup( ext_modules=cythonize( "main.py", compiler_directives={"language_level": 3, "annotation_typing": False} ) )
执行编译命令:
python setup.py build_ext --inplace
再用GCC链接生成二进制文件。
方案4:升级依赖版本
确保Cython(≥0.29.30)和Typer(≥0.6.0)为最新稳定版,新版本可能已修复此类兼容性问题。
完整编译流程示例
- Cython转C文件:
cython main.py --embed -3
- GCC编译二进制(替换为你的Python版本路径):
gcc -Os -I/usr/include/python3.10 -o main main.c -lpython3.10 -lpthread -lm -lutil -ldl
内容的提问来源于stack exchange,提问作者altoensodio
相关产品推荐
相关产品推荐

