You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu下用Cython+MinGW64编译pyx为exe报错求助

WSL Ubuntu下Cython交叉编译生成Windows EXE解决方案

问题根源

直接调用x86_64-w64-mingw32-gcc时,你用了Linux版的python3-config获取编译参数,这会指向WSL内的Linux Python环境,而非Windows Python。同时缺少Windows平台的宏定义,导致SIZEOF_WCHAR_T未定义等错误。以下是分步解决办法:


1. 安装必要工具

先确保交叉编译工具和依赖齐全:

sudo apt update && sudo apt install gcc-mingw-w64-x86-64 python3-dev python3-pip
pip install cython

2. 调整代码结构(生成独立EXE必备)

在qrawler.pyx末尾添加主函数入口,让Cython能嵌入Python解释器:

def main():
    # 把你原来的主程序逻辑放到这里
    pass

if __name__ == "__main__":
    main()

3. 准备Windows Python环境文件

因为要交叉编译Windows程序,需要Windows版Python的头文件和库:

  • 从Python官网下载对应版本的Windows嵌入包(64位,和你WSL里的Python版本尽量一致)
  • 解压到WSL的某个目录,比如~/win-python,解压后会有include(头文件)和libs(库文件)两个目录

4. 直接编译生成EXE

先通过Cython生成带嵌入解释器的C文件:

cython --embed -3 qrawler.pyx

然后用mingw编译,指定Windows Python的路径和缺失的宏定义:

x86_64-w64-mingw32-gcc -o qrawler.exe qrawler.c \
  -I~/win-python/include \
  -L~/win-python/libs \
  -lpython311 \  # 替换成你的Python版本,比如python310对应3.10
  -DMS_WIN64 \
  -DSIZEOF_WCHAR_T=2

5. 处理第三方依赖(Selenium、Firebase等)

编译后的EXE需要依赖库的支持,有两种方式:

  • 方式一:打包依赖文件
    把Selenium、Firebase等库的Python文件复制到EXE所在目录,同时确保Windows端有ChromeDriver等Selenium依赖。
  • 方式二:用PyInstaller打包(更简便)
    先把pyx编译成本地扩展,再用PyInstaller打包成独立EXE:
    # 编译pyx为pyd文件
    python setup.py build_ext --inplace --compiler=mingw32
    # 用PyInstaller打包(自动处理依赖)
    pyinstaller --onefile --noconsole --target-architecture=amd64 qrawler.py
    

错误原因解析

  • pyconfig.h多架构位置未知:python3-config返回的是Linux Python的路径,交叉编译时必须指定Windows Python的头文件目录。
  • 未定义SIZEOF_WCHAR_T:Windows平台下wchar_t的大小固定为2字节,手动添加-DSIZEOF_WCHAR_T=2宏定义即可解决。

内容的提问来源于stack exchange,提问作者Kevy legit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 12:55:39