使用py2app打包时如何修复TypeError: expected str... not NoneType错误
问题:py2app打包Minecraft打开次数统计应用失败
单独运行Python脚本正常,但用py2app打包时构建失败,报错:
File "<frozen posixpath>", line 415, in realpath TypeError: expected str, bytes or os.PathLike object, not NoneType
我的Python脚本
import os, getpass path = "/Applications/Minecraft.app" os.system(f"open {path}") username = getpass.getuser() with open ('/Users/'+username+'/Library/Application Support/minecraft/resourcepacks/Splash/assets/minecraft/log.txt', 'a') as f: f.write("lol\n") with open ('/Users/'+username+'/Library/Application Support/minecraft/resourcepacks/Splash/assets/minecraft/log.txt', 'r') as f: x = len(f.readlines()) with open ('/Users/'+username+'/Library/Application Support/minecraft/resourcepacks/Splash/assets/minecraft/texts/splashes.txt', 'w') as f: f.write("Opened " + str(x) + " times!")
setup.py代码
from setuptools import setup APP = ['minecraft.py'] DATA_FILES = ["icon.icns"] OPTIONS = { 'iconfile':'icon.icns', 'argv_emulation': True, 'plist': { 'LSUIElement': True, }, 'packages': ['os', 'getpass'], } setup( app=APP, data_files=DATA_FILES, options={'py2app': OPTIONS}, setup_requires=['py2app'], )
使用的终端命令
python3 setup.py py2app
系统环境:macOS Ventura
解决方向
- 移除OPTIONS中的
packages配置:os和getpass是Python标准库,py2app会自动识别处理,手动添加反而可能触发路径解析错误。 - 优化文件路径拼接:用
os.path.join()代替字符串拼接,避免因路径格式问题产生None值,示例:log_path = os.path.join('/Users', username, 'Library', 'Application Support', 'minecraft', 'resourcepacks', 'Splash', 'assets', 'minecraft', 'log.txt') splash_path = os.path.join('/Users', username, 'Library', 'Application Support', 'minecraft', 'resourcepacks', 'Splash', 'assets', 'minecraft', 'texts', 'splashes.txt') - 检查
icon.icns文件路径:确保该文件存在于执行打包命令的当前工作目录,路径无误。 - 尝试关闭
argv_emulation:如果应用不需要处理命令行参数,该选项可能引发不必要的环境变量或路径问题。 - 确认Python环境一致性:打包时使用的Python环境需与运行脚本时一致,避免依赖或路径冲突。
内容的提问来源于stack exchange,提问作者Egloo Dude
相关产品推荐
相关产品推荐

