我正在制作一个python桌面应用程序,该程序将日志另存为.csv文件到Windows上用户的Documents文件夹中。该应用程序是用python 2.7和kivy 1.8.0编写的,使用pyinstaller 2.1打包为Windows程序,而安装程序是使用Inno Setup Compiler制作的。在这篇文章中,我将用USER替换用户的真实姓名。

我有以下几行代码:

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。

最佳答案

expanduser的文档中:



如您所见,代码非常简单(与inspect一起转储了):

def expanduser(path):
    """Expand ~ and ~user constructs.

    If user or $HOME is unknown, do nothing."""
    if path[:1] != '~':
        return path
    i, n = 1, len(path)
    while i < n and path[i] not in '/\\':
        i = i + 1

    if 'HOME' in os.environ:
        userhome = os.environ['HOME']
    elif 'USERPROFILE' in os.environ:
        userhome = os.environ['USERPROFILE']
    elif not 'HOMEPATH' in os.environ:
        return path
    else:
        try:
            drive = os.environ['HOMEDRIVE']
        except KeyError:
            drive = ''
        userhome = join(drive, os.environ['HOMEPATH'])

    if i != 1: #~user
        userhome = join(dirname(userhome), path[1:i])

    return userhome + path[i:]
expanduser本身并不会出错。您需要检查程序中的那些环境变量,以查看它们是否具有正确的值。
    import os
    for var in ('HOME', 'USERPROFILE', 'HOMEPATH', 'HOMEDRIVE'):
        print os.environ.get(var)
open可能失败的可能原因是,您试图打开文件的目录不存在,或者您没有访问该文件的权限。

关于python - 为什么os.path.expanduser不返回主目录?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24679918/

10-11 01:36