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

Mac下py2app打包的.app文件如何读取所在文件夹文件?

解决py2app打包后HTTP服务器无法读取.app所在文件夹内容的问题

问题根源在于py2app打包后,程序默认的工作目录是.app包内部的Contents/MacOS或Contents/Resources路径,而非.app文件所在的外部文件夹,因此SimpleHTTPRequestHandler会默认服务这个内部目录的文件。

要让服务器服务.app所在的文件夹,需要手动指定目标目录,具体修改如下:

修改代码步骤

  1. 添加逻辑获取.app所在的父目录
  2. 自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:13:18