MacOS下将Python脚本打包为可执行文件后读取同目录可编辑.env文件的问题求助
MacOS下将Python脚本打包为可执行文件后读取同目录可编辑.env文件的问题求助
嗨,James!这个问题我之前也碰到过,本质是PyInstaller单文件打包后的路径机制导致的,我给你一步步讲清楚怎么解决:
问题根源
当你用pyinstaller --onefile打包时,生成的可执行文件运行时会先把自己解压到系统临时目录(比如/tmp/_MEIxxxxxx这类随机命名的文件夹),然后在临时目录里执行代码。这时候你的load_dotenv()默认会在临时目录找.env文件,而不是你放置可执行文件的实际目录,所以才会读不到变量返回None。
解决方法:修改代码明确指定.env路径
你需要在代码里先获取当前可执行文件的实际存放目录,再拼接同目录下的.env文件路径,这样不管可执行文件被放到哪里运行,都能精准找到同目录的.env。修改后的代码如下:
import os import sys from dotenv import load_dotenv # 获取可执行文件/脚本的所在目录 def get_current_dir(): # 如果是打包后的可执行文件 if getattr(sys, 'frozen', False): return os.path.dirname(sys.executable) # 如果是开发环境下的脚本 else: return os.path.dirname(os.path.abspath(__file__)) # 拼接同目录下的.env文件路径 env_file_path = os.path.join(get_current_dir(), '.env') load_dotenv(dotenv_path=env_file_path) test_environment_variable = os.environ.get("TEST_ENVIRONMENT_VARIABLE") print(test_environment_variable)
验证步骤
- 用修改后的代码重新打包:
pyinstaller --onefile main.py - 把生成的可执行文件和你的
.env文件放在同一个目录下 - 运行可执行文件,现在应该能正确读取
.env里的变量了 - 修改
.env内容并保存后重新运行,输出会同步更新为新的变量值
额外小提示
.env文件的规范写法是变量名和值之间不要加空格,值也不需要引号,比如TEST_ENVIRONMENT_VARIABLE=This is a new test environment variable(当然你原来带空格和引号的写法也能被读取,但规范写法更不容易出问题)- 如果要把可执行文件分发给其他人,可以同时附带一个
.env.example模板文件,让用户复制并重命名为.env后再修改内容
这样处理后,你的可执行文件就能稳定读取同目录下的可编辑.env文件啦!
备注:内容来源于stack exchange,提问作者user60707




