Mac下py2app打包的.app文件如何读取所在文件夹文件?
解决py2app打包后HTTP服务器无法读取.app所在文件夹内容的问题
问题根源在于py2app打包后,程序默认的工作目录是.app包内部的Contents/MacOS或Contents/Resources路径,而非.app文件所在的外部文件夹,因此SimpleHTTPRequestHandler会默认服务这个内部目录的文件。
要让服务器服务.app所在的文件夹,需要手动指定目标目录,具体修改如下:
修改代码步骤
- 添加逻辑获取
.app所在的父目录 - 自定义HTTP请求处理器,指定服务的目标目录
修改后的完整代码:
import os import sys import socketserver import http.server PORT = 8080 def get_app_parent_dir(): # 获取打包后二进制文件的绝对路径(位于.app/Contents/MacOS/目录下) exe_path = os.path.abspath(sys.executable) # 向上回溯3层目录,得到.app文件所在的父目录 # 路径结构:xxx.app/Contents/MacOS/xxx → 最终定位到xxx.app的上级文件夹 return os.path.dirname(os.path.dirname(os.path.dirname(exe_path))) # 自定义处理器,指定服务目录为.app所在的父目录 class CustomHTTPHandler(http.server.SimpleHTTPRequestHandler): def __init__(self, *args, **kwargs): target_dir = get_app_parent_dir() super().__init__(*args, directory=target_dir, **kwargs) with socketserver.TCPServer(("", PORT), CustomHTTPHandler) as httpd: print(f"serving directory: {get_app_parent_dir()} at port {PORT}") httpd.serve_forever()
代码说明
get_app_parent_dir():通过sys.executable获取打包后程序的二进制文件路径,逐层向上回溯目录,最终定位到.app文件所在的外部文件夹。CustomHTTPHandler:继承自SimpleHTTPRequestHandler,初始化时通过directory参数指定服务的目标文件夹,覆盖默认的内部工作目录。
重新用py2app打包修改后的代码,运行生成的.app后,HTTP服务器就会展示.app所在文件夹的内容了。
内容的提问来源于stack exchange,提问作者Astro3000
相关产品推荐
相关产品推荐

