如何将整个目录添加至py2app的setup文件?
别担心,刚接触Python遇到打包相关的问题太正常啦,我来一步步帮你解决~
解决py2app中添加整个目录到DATA_FILES及生成文件路径的问题
一、把整个目录添加到DATA_FILES里
py2app的DATA_FILES支持用元组的形式批量指定目录结构,格式是('目标路径', ['源文件路径列表']),这样就能把整个目录的文件一次性打包进去。具体操作如下:
- 先导入
os模块,用来遍历目录里的文件 - 定义你的资源目录(比如把所有需要打包的文件都放到
assets目录里) - 自动生成该目录下所有文件的路径列表
- 把目录对应的元组加入
DATA_FILES
修改后的setup.py示例:
""" This is a setup.py script generated by py2applet Usage: python setup.py py2app """ from setuptools import setup import os APP = ['KeyPass.py'] # 替换成你实际的资源目录名 resource_dir = 'assets' # 获取目录下所有文件的完整路径 resource_files = [ os.path.join(resource_dir, f) for f in os.listdir(resource_dir) if os.path.isfile(os.path.join(resource_dir, f)) ] DATA_FILES = [ # 第一个元素是app内的目标路径,第二个是要打包的源文件列表 (resource_dir, resource_files), # 如果还有单独的文件要直接放在根资源目录,可以继续添加 # ('', ['kristoffer.txt']) ] OPTIONS = { 'iconfile':'appicon.icns', } setup( app=APP, data_files=DATA_FILES, options={'py2app': OPTIONS}, setup_requires=['py2app'], )
打包完成后,assets目录里的所有文件会被复制到YourApp.app/Contents/Resources/assets路径下,和其他资源文件放在一起。
二、让脚本生成的文件可访问并与其他文件共存
打包后的app,资源文件都存放在Contents/Resources目录下,你的脚本运行时需要先定位到这个目录,再把生成的文件放在这里。可以写一个工具函数,同时适配开发环境和打包后的环境:
在你的KeyPass.py中添加以下代码:
import os import sys def get_resource_path(relative_path): """获取资源文件的绝对路径,适配开发和打包后的环境""" if hasattr(sys, '_MEIPASS'): # 打包后的环境,sys._MEIPASS指向Resources目录 return os.path.join(sys._MEIPASS, relative_path) # 开发环境,直接返回当前目录下的路径 return os.path.join(os.path.abspath('.'), relative_path)
之后生成文件时,用这个函数来获取路径:
# 示例:生成一个叫output.txt的文件,放在资源目录下 output_file_path = os.path.join(get_resource_path(''), 'output.txt') with open(output_file_path, 'w') as f: f.write('这是脚本生成的内容')
不管是本地开发运行,还是打包成app后,都能正确找到资源目录,生成的文件也会和其他资源文件放在一起,确保可以正常访问。
内容的提问来源于stack exchange,提问作者kriwet
相关产品推荐
相关产品推荐

