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)))
验证步骤
- 替换代码后重新执行打包命令:
pyinstaller -D demo.py - 把
/dist/demo目录移动到任意位置,双击运行demo文件,就能输出该目录的实际路径了。
内容的提问来源于stack exchange,提问作者Degang Guo
相关产品推荐
相关产品推荐

