我正在制作一款Python桌面应用程序,将日志保存为.csv文件并存储在Windows用户的“文档”文件夹中。该应用程序使用Python 2.7和Kivy 1.8.0编写,使用Pyinstaller 2.1封装为Windows程序,并使用Inno Setup Compiler创建安装程序。在本文中,我将使用USER替换用户的真实姓名。
以下是我的代码行:
在我的电脑和另一台我测试过的电脑上,该程序按预期工作。DOCUMENTS 的值为 'C:\Users\USER\Documents\'。然而,在我尝试的另外三台电脑上,DOCUMENTS 的值为 'C:\Users\USER\AppData\Roaming\SPB_16.6\Documents\'。当程序尝试创建 data_log.csv 时,程序会崩溃,并给出以下错误:
以下是我的代码行:
DOCUMENTS = os.path.expanduser('~\\Documents\\')
print DOCUMENTS
with open(DOCUMENTS + 'data_log.csv', 'ab') as f:
do stuff
在我的电脑和另一台我测试过的电脑上,该程序按预期工作。DOCUMENTS 的值为 'C:\Users\USER\Documents\'。然而,在我尝试的另外三台电脑上,DOCUMENTS 的值为 'C:\Users\USER\AppData\Roaming\SPB_16.6\Documents\'。当程序尝试创建 data_log.csv 时,程序会崩溃,并给出以下错误:
IOError: [Errno 2] No such file or directory: 'C:\\Users\\USER\\AppData\Roaming\\SPB_16.6\\Documents\\data_log.csv'
首先,为什么os.path.expanduser在某些系统上表现不佳,而在其他系统上则正常?
其次,即使文件在错误的目录中,open()也应该在文件不存在时创建文件,那么为什么这会导致程序崩溃?
我已经找到了问题所在。在大多数系统中,HOME为None,因此os.path.expanduser使用USERPROFILE代替。然而,在极少数情况下,HOME被设置为类似于C:\SPB\或C:\Users\USER\AppData\Roaming\SPB_16.6之类的内容。我的解决方法是使用os.environ来直接访问USERPROFILE,而不是使用os.path.expanduser。