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

M1 Mac下如何将基于Pygame的Python脚本打包为DMG文件?

M1 Mac下Pygame程序打包DMG的可行方案

问题根源

M1系列为ARM64架构,py2app与Pygame的架构兼容性、资源文件格式、代码初始化顺序都可能导致打包失败,以下是针对性解决方法:

方法一:修复py2app配置,适配ARM64架构

  1. 重装适配ARM64的依赖包
    pip install pygame py2app --force-reinstall --no-binary :all:
    
  2. 创建setup.py配置文件(替换your_script.py为你的脚本文件名)
    from setuptools import setup
    
    APP = ['your_script.py']
    # 注意:将icon.ico转换为Mac支持的.icns格式,替换为你的图标文件名
    DATA_FILES = ['app_icon.icns']
    OPTIONS = {
        'argv_emulation': True,
        'packages': ['pygame'],
        'includes': ['pygame'],
        'plist': {
            'CFBundleName': 'Desktop Clock',
            'CFBundleDisplayName': 'Desktop Clock',
            'CFBundleVersion': "0.1.0",
            'CFBundleShortVersionString': "0.1.0",
            'CFBundleIconFile': 'app_icon.icns'
        }
    }
    
    setup(
        app=APP,
        data_files=DATA_FILES,
        options={'py2app': OPTIONS},
        setup_requires=['py2app'],
    )
    
  3. 执行打包命令,生成通用架构包
    python setup.py py2app --universal2
    
    打包完成后,dist目录下会生成.app文件,可通过系统自带的磁盘工具将其打包为DMG。

方法二:改用PyInstaller打包(兼容性更好)

  1. 安装ARM64版本的PyInstaller
    pip install pyinstaller --force-reinstall --no-binary :all:
    
  2. 执行打包命令(替换对应文件名)
    pyinstaller --windowed --icon=app_icon.icns --name "Desktop Clock" --add-data "app_icon.icns:." your_script.py
    
    打包后dist目录下的.app文件可直接转为DMG,--add-data参数用于确保资源文件被正确打包。

方法三:使用Conda环境规避架构冲突

  1. 安装适配M1的Miniforge,创建并激活专属环境
    conda create -n pygame_env python=3.10
    conda activate pygame_env
    
  2. 安装适配ARM64的依赖
    conda install pygame py2app -c conda-forge
    
  3. 参照方法一的setup.py配置执行打包即可。

代码优化建议

原代码存在两处可能导致打包后异常的问题,建议修改:

import pygame

# 先初始化Pygame,再加载图标
pygame.init()

# 替换为Mac支持的png/icns格式图标
img = pygame.image.load('app_icon.png')
pygame.display.set_icon(img)

size = (800, 600)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Desktop Clock")

done = False
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    screen.fill((255, 255, 255))
    pygame.display.flip()

pygame.quit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:28:33