Python3.7项目如何在macOS上打包成Windows可执行文件

楼主是 macos 的系统,用了 pyinstaller 在 mac 上打包一个比较简单的 python3.7 的项目,不含 gui,打包出来的程序是Mach-O 64-bit executable x86_64,windows 的用户并不能使用,请问如何打包才可以让 windows 的用户也能体验呢,最差的情况就只能在我 windows 的虚拟机上打包了,各位大佬有什么办法吗


Python3.7项目如何在macOS上打包成Windows可执行文件
18 回复

让我想起了 goagent


用PyInstaller就行,这是最主流的方法。你需要在macOS上操作,但最终生成的是Windows的.exe文件,这需要用到“交叉编译”。不过直接搞很麻烦,通常更靠谱的是在macOS上装个Windows虚拟机,或者用CI/CD服务(比如GitHub Actions)来打包。

这里给你个在macOS上准备环境和打包的命令行示例。我们假设你的项目主入口文件是 main.py

1. 创建虚拟环境并安装依赖

# 在你的项目目录下
python3.7 -m venv venv
source venv/bin/activate
pip install --upgrade pip
# 安装你的项目依赖,例如:
# pip install -r requirements.txt
pip install pyinstaller

2. 使用PyInstaller打包(生成macOS本地的spec文件用于参考)

# 先生成一个spec文件看看结构
pyinstaller --name MyApp --onefile main.py

这会生成一个 MyApp.spec 文件。但注意,这个spec文件配置是针对macOS的。要生成Windows exe,关键是要在PyInstaller内部使用Windows的Python解释器和库,这在macOS上无法直接完成。

3. 实际方案:使用虚拟机或CI 由于macOS和Windows系统二进制不兼容,我强烈建议你采用以下两种实际方案之一:

  • 方案A:使用Windows虚拟机(Parallels, VMware, VirtualBox)

    1. 在虚拟机里安装一个干净的Windows系统。
    2. 在Windows里安装Python 3.7,设置好你的项目环境。
    3. 在Windows命令行里运行:
      pip install pyinstaller
      pyinstaller --name MyApp --onefile --clean main.py
      

    生成的 .exe 文件就在 dist 文件夹里。

  • 方案B:使用GitHub Actions自动化打包(推荐) 在你的项目根目录创建 .github/workflows/build-windows.yml 文件:

    name: Build Windows Executable
    
    on:
      push:
        branches: [ main ]
      release:
        types: [created]
    
    jobs:
      build:
        runs-on: windows-latest
        steps:
        - uses: actions/checkout@v3
        - name: Set up Python 3.7
          uses: actions/setup-python@v4
          with:
            python-version: '3.7'
        - name: Install dependencies
          run: |
            python -m pip install --upgrade pip
            pip install -r requirements.txt
            pip install pyinstaller
        - name: Build with PyInstaller
          run: |
            pyinstaller --name MyApp --onefile --clean main.py
        - name: Upload artifact
          uses: actions/upload-artifact@v3
          with:
            name: MyApp-Windows
            path: dist/MyApp.exe
    

    这样每次推送代码或发布新版本时,会自动在Windows环境下打包,你直接下载生成的exe文件就行。

总结一下: 别折腾macOS交叉编译,费时还不稳定,直接用Windows虚拟机或GitHub Actions来打包最省心。

如果打包出来的是二进制文件想要跨平台的话,就很为难了…

用 ci 呗,有支持 windows 的 ci 吧

文档里面说得很清楚了,得在 Windows 上打包。

如果真那么刚需, 用嵌入式的绿色版 Python 解释器加 shiv 来打包吧, 我打过这种倒是

https://github.com/ClericPy/distribute-python-on-windows

以前随手撸的, 不知道还能跑不能… 说白了就是解释器指望绿色版 Python, package 指望 shiv 使用 PEP 441 协议打包成一个 pyz 文件, 就酱

源码无关的话,直接给源码跑起来不好么,要是源码不能给的话,你折腾来折腾去还不如找一台 win 机临时打包一下,或者就用你那虚拟机,,,

用 go 重构

一次获取 linux-amd64 linux-386 darwin-amd64 darwin-386 windows-amd64 windows-386 freebsd-amd64 freebsd-386 linux-arm linux-arm64 架构的二进制文件

在 windows 的 docker 镜像里面打包呗……

Windows 的 docker images (windows server core)不是只能在 windows 的主機運行嗎

唯一一个靠谱的答案,其它都是强答。

哈哈, V 站划水比例 1:9
另外, shiv 没试过打包 C lib 会不会跪, 理论上应该会凉

pyinstaller 就是这样,在哪个环境打包,就只能在哪个环境运行。
我当时 win 的 x64 打包,x86 都不能用,最后用了个什么命令强制设置 python 环境为 32 位,然后打包后,还找了个 32 位机器测试。麻烦的很。

这种坑都不会少,只能慢慢踩,看人品

回到顶部