我已经用PyQt5创建了一个应用程序,并使用Pyinstaller捆绑了它。 该应用程序从login.properties文件加载登录信息,该文件与启动该应用程序的.py文件存储在同一目录中。
根据建议here,我正在使用以下功能修改路径:
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')
因此,更改后的登录信息将保存到临时文件/文件夹中,而不保存到“原始”文件中。
有什么想法可以减轻这个问题吗?
答案 0 :(得分:2)
_MEIPASS 是一个临时文件夹,可以。有时使用条件if hasattr(sys, '_MEIPASS')
来了解应用程序是从源运行还是已构建。
请勿将配置文件保存到_MEIPASS文件夹中。在用户目录下创建应用程序的文件夹是一个好习惯。如果您运行dev版本(从源代码),请在sources目录中创建一个文件,否则在users目录中创建一个文件。
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
答案 1 :(得分:0)
我以前也遇到过同样的问题,看来如果您尝试以--onefile模式写入或创建文件,则不会保存该文件。但是,可以通过在编译命令中包含数据文件来解决此问题:
C:\Users\user>pyinstaller myfile.py -F --add-data path/to/file/file.txt