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

macOS下Python经PyInstaller打包后os.getcwd()返回值异常问题

macOS下PyInstaller打包脚本双击运行时os.getcwd()返回用户目录而非程序所在目录的解决办法

问题描述

我有一段用于输出当前工作目录的Python代码:

# -*- coding: utf-8 -*-
import os
if __name__ == "__main__":
    print os.getcwd()

使用PyInstaller打包的命令是:

pyinstaller -D demo.py

打包后得到/dist/demo目录。但在macOS下,无论在任意位置双击运行/dist/demo/demo文件,返回结果均为/Users/myname;而Windows/Linux系统中双击运行时会返回文件所在的目录,请问该如何解决这个异常?


解决办法

这个问题我之前也碰到过,macOS下PyInstaller打包的程序双击运行时,系统会默认把用户主目录设为当前工作目录,这和Windows/Linux的行为逻辑不一样。要获取程序实际所在的目录,不能依赖os.getcwd(),而是要通过获取程序自身的执行路径来推导。

方法一:获取可执行文件的路径并推导所在目录

修改你的代码,替换os.getcwd()为获取程序自身路径的逻辑,这样不管是双击运行还是在终端执行,都能正确拿到程序所在的目录:

# -*- coding: utf-8 -*-
import os
import sys

def get_program_directory():
    # 判断是否是打包后的可执行文件
    if getattr(sys, 'frozen', False):
        # 打包后,sys.executable指向生成的可执行文件路径
        executable_path = sys.executable
    else:
        # 未打包时,__file__是当前脚本的路径
        executable_path = os.path.abspath(__file__)
    # 返回可执行文件所在的目录
    return os.path.dirname(executable_path)

if __name__ == "__main__":
    print(get_program_directory())

补充:如果打包成.app格式的处理(可选)

如果你后续用-n demo.app这类参数打包成macOS的.app应用包,可执行文件实际在demo.app/Contents/MacOS/目录下,要是你需要获取.app文件所在的目录,可以在上面的基础上再往上回溯两级目录:

app_package_dir = os.path.dirname(os.path.dirname(os.path.dirname(executable_path)))

验证步骤

  1. 替换代码后重新执行打包命令:pyinstaller -D demo.py
  2. 把/dist/demo目录移动到任意位置,双击运行demo文件,就能输出该目录的实际路径了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:33:48