python - 仅在使用 Pyinstaller 可执行文件时临时保存的数据文件
问题描述
我已经使用 PyQt5 创建了一个应用程序,并使用 Pyinstaller 将其捆绑在一起。应用程序从 login.properties 文件加载登录信息,该文件存储在与启动应用程序的 .py 文件相同的目录中。
正如这里所建议的,我正在使用以下函数修改路径:
import os, sys
# Translate asset paths to useable format for PyInstaller
def resource_path(relative_path):
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath('.'), relative_path)
它导致的原因是它创建了一个名为 _MEIPASS 的临时文件夹,其中包含文件,例如我的 login.properties。
在应用程序中,我想使用以下函数保存 login.properties 信息:
self.loginFile = resource_path('./login.properties')
def save_login_info(self):
config = configparser.ConfigParser()
config.read(self.loginFile)
pw = self.login_ui.password_lineEdit.text()
un = self.login_ui.username_lineedit.text()
token = self.login_ui.token_lineEdit.text()
alias = self.login_ui.gmail_alias_lineedit_2.text()
...
config.set('Login', 'password', pw )
config.set('Login', 'username', un )
config.set('Login', 'security_token', token )
config.set('Login', 'alias', alias)
with open(self.loginFile, 'w') as loginfile:
config.write(loginfile)
print('Login info saved')
因此,更改后的登录信息将保存到临时文件/文件夹中,而不是保存到“原始”文件中。
任何想法如何缓解这个问题?
解决方案
_MEIPASS是一个临时文件夹,是的。该条件if hasattr(sys, '_MEIPASS')
有时用于了解应用程序是从源运行还是已构建。
不要将配置文件保存到 _MEIPASS 文件夹中。在用户目录中创建应用程序的文件夹是一个很好的做法。如果您运行开发版本(来自源),请在源目录中创建一个文件,否则在用户目录中创建一个文件。
def get_config_path():
if hasattr(sys, "_MEIPASS"):
abs_home = os.path.abspath(os.path.expanduser("~"))
abs_dir_app = os.path.join(abs_home, f".my_app_folder")
if not os.path.exists(abs_dir_app):
os.mkdir(abs_dir_app)
cfg_path = os.path.join(abs_dir_app, "login.properties")
else:
cfg_path = os.path.abspath(".%slogin.properties" % os.sep)
return cfg_path
推荐阅读
- java - 堆叠@Bean 和@Autowired 注解
- c# - 使用 .net web api 和 tinyioc 解决依赖关系
- swagger - Swashbuckle 将 Auth Bearer Token 传递给 API
- c# - ASP.NET MVC 不良做法:具有必需属性的可选子模型 - 虽然不使用必需
- javascript - slack web 客户端如何解析 URL 并响应目标 URL 图像和文本?
- kiln - 导入扩展 kiln.py 失败
- angular - 您的项目未使用默认配置进行构建和测试
- java - Android:如何在没有物理按钮的设备上强制显示虚拟按钮?
- c++ - C++ gRPC线程数配置
- ms-access - 如何在 Access 2016 中的查询和表之间创建一对多关系?