【python以打包的形式运行和脚本形式运行获取路径注意事项】
getattr(sys, 'frozen', False)
是 Python 里用于判断程序是否以打包后的可执行文件形式运行的常用代码。下面详细解释其作用:
代码分析
sys
是 Python 的标准库模块,提供了与 Python 解释器和系统相关的功能与变量。getattr()
是 Python 的内置函数,其作用是获取对象的属性值。该函数接收三个参数:对象、属性名和默认值。若对象存在指定属性,就返回该属性的值;若不存在,则返回默认值。'frozen'
是一个属性名。当 Python 程序被打包成可执行文件(如使用 PyInstaller、cx_Freeze 等工具)时,sys
模块会添加一个名为frozen
的属性。False
是默认值。若sys
模块没有frozen
属性,getattr()
函数就会返回False
。
示例代码
import os
import sys
# 获取运行目录(适配打包后的exe)
if getattr(sys, 'frozen', False):
# 运行在打包后的exe中
BASE_DIR = sys._MEIPASS
ROOT_DIR = os.path.dirname(sys.executable)
else:
# 正常以脚本形式运行
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
ROOT_DIR = BASE_DIR
应用场景
- 资源路径处理:在打包后的可执行文件里,资源文件(像图片、配置文件等)的路径和 Python 脚本运行时的路径可能不同。通过判断
sys.frozen
属性,能使用不同的路径来访问资源。 - 调试信息:在开发和调试阶段,可能需要输出更多的调试信息;而在打包后的可执行文件中,这些调试信息可能不需要。借助判断
sys.frozen
属性,可控制是否输出调试信息。
这两行代码主要用于处理Python程序打包成可执行文件后,文件路径相关的操作,下面为你详细解释每一行代码:
1. BASE_DIR = sys._MEIPASS
代码功能
这行代码的作用是获取Python程序打包成可执行文件后,临时资源文件夹的路径,并将其赋值给变量BASE_DIR
。
详细解释
sys
是Python的标准库模块,它提供了许多与Python解释器和系统相关的变量和函数。_MEIPASS
是PyInstaller打包工具在打包程序时,添加到sys
模块中的一个属性。当使用PyInstaller将Python程序打包成可执行文件时,它会将程序依赖的资源(如图片、配置文件等)提取到一个临时文件夹中,sys._MEIPASS
就指向这个临时文件夹的路径。
应用场景
在打包后的程序中,如果需要访问这些依赖资源,就可以使用 BASE_DIR
作为基础路径来构建资源文件的完整路径。例如:
import sys
import os
BASE_DIR = sys._MEIPASS
# 假设资源文件夹中有一个名为 'example.txt' 的文件
file_path = os.path.join(BASE_DIR, 'example.txt')
2. ROOT_DIR = os.path.dirname(sys.executable)
代码功能
这行代码的作用是获取当前可执行文件所在的目录路径,并将其赋值给变量ROOT_DIR
。
详细解释
sys.executable
是sys
模块的一个属性,它返回当前Python解释器或者打包后的可执行文件的完整路径。os.path.dirname()
是os.path
模块中的一个函数,它接受一个文件路径作为参数,并返回该文件所在的目录路径。
应用场景
在程序中,如果需要操作与可执行文件同目录下的文件,就可以使用 ROOT_DIR
作为基础路径。例如,在可执行文件所在目录下创建一个新的文件:
import sys
import os
ROOT_DIR = os.path.dirname(sys.executable)
new_file_path = os.path.join(ROOT_DIR, 'new_file.txt')
with open(new_file_path, 'w') as f:
f.write('This is a new file.')
总结
这两行代码通常用于处理Python程序打包成可执行文件后的路径问题,sys._MEIPASS
用于获取临时资源文件夹的路径,os.path.dirname(sys.executable)
用于获取可执行文件所在的目录路径。