Windows10下Python嵌入式版本使用Cython cythonize工具报错
解决Python嵌入式版本下cythonize报错ModuleNotFoundError: No module named 'distutils'
问题详情
使用Python嵌入式版本(不愿切换至安装版),执行cythonize utils.py命令时触发以下错误:
Traceback (most recent call last): File "<frozen runpy>", line 198, in _run_module_as_main File "<frozen runpy>", line 88, in _run_code File "D:\Develop\python\Scripts\cythonize.exe\__main__.py", line 7, in <module> File "D:\Develop\python\Lib\site-packages\Cython\Build\Cythonize.py", line 251, in main _cython_compile_files(all_paths, options) File "D:\Develop\python\Lib\site-packages\Cython\Build\Cythonize.py", line 67, in _cython_compile_files ext_modules = cythonize( ^^^^^^^^^^ File "D:\Develop\python\Lib\site-packages\Cython\Build\Dependencies.py", line 1010, in cythonize module_list, module_metadata = create_extension_list( ^^^^^^^^^^^^^^^^^^^^^^ File "D:\Develop\python\Lib\site-packages\Cython\Build\Dependencies.py", line 784, in create_extension_list from distutils.extension import Extension ModuleNotFoundError: No module named 'distutils'
相关配置及文件信息:
- python312._pth内容:
python312.zip DLLs Lib Lib\.. Lib\site-packages # Uncomment to run site.main() automatically #import site
- 已安装包列表:
Package Version ---------- ------- asgiref 3.8.1 Cython 3.0.10 Django 5.0.6 pip 24.1.1 setuptools 70.0.0 sqlparse 0.5.0 tzdata 2024.1 wheel 0.43.0
- utils.py内容:
#!/usr/bin/env python # -*- coding: utf-8 -*- # cython: language_level=3 import sys def sayHello(name:str): print("sayHello utils:" + name)
已尝试将Cython路径添加至python312.pth,但未解决问题。
可行解决方案
方案1:启用site模块(推荐)
Python嵌入式版本默认注释了site模块的加载,而setuptools已包含兼容版的distutils,启用site模块后会自动处理路径:
- 打开
python312._pth文件,将#import site行的注释符号#去掉; - 保存文件后,关闭并重新打开终端;
- 再次执行
cythonize utils.py即可。
方案2:手动添加distutils路径
如果不想启用site模块,可通过脚本临时添加setuptools内置的distutils路径:
- 创建
run_cythonize.py文件,内容如下:
import sys # 替换为你的嵌入式Python的setuptools/_distutils路径 sys.path.append("D:\\Develop\\python\\Lib\\site-packages\\setuptools\\_distutils") from Cython.Build.Cythonize import main main()
- 执行命令:
python run_cythonize.py utils.py
方案3:复制完整distutils文件夹
从同版本的Python安装版(Python 3.12)的Lib目录下,复制distutils文件夹到嵌入式Python的Lib目录中,确保版本完全匹配。
内容的提问来源于stack exchange,提问作者Jo Omer
相关产品推荐
相关产品推荐

