Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么os.path.expanduser不返回主目录?_Python_Windows_Path_Os.path - Fatal编程技术网

Python 为什么os.path.expanduser不返回主目录?

Python 为什么os.path.expanduser不返回主目录?,python,windows,path,os.path,Python,Windows,Path,Os.path,我正在制作一个python桌面应用程序,它将日志保存为Windows上用户文档文件夹中的.csv文件。该应用程序是用python 2.7和kivy 1.8.0编写的,使用pyinstaller 2.1打包为Windows程序,使用Inno Setup编译器进行安装。在这篇文章中,我将用user替换用户的真实姓名 我有以下几行代码: DOCUMENTS = os.path.expanduser('~\\Documents\\') print DOCUMENTS with open(DOCUMENT

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

我有以下几行代码:

DOCUMENTS = os.path.expanduser('~\\Documents\\')
print DOCUMENTS
with open(DOCUMENTS + 'data_log.csv', 'ab') as f:
    do stuff
在我的电脑和另一台我已经测试过的电脑上,程序工作正常。文档的计算结果为“C:\Users\USER\DOCUMENTS\”。但是,在我尝试过的其他三台计算机上,文档的计算结果为“C:\Users\USER\AppData\Roaming\SPB_16.6\DOCUMENTS\”。然后,程序在尝试创建数据_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\U 16.6。我的解决方案是使用os.environ直接访问USERPROFILE,而不是使用os.path.expanduser。

来自
expanduser
的文档:

在Windows上,如果已设置,则将使用HOME和USERPROFILE,否则将使用 将使用HOMEPATH和HOMEDRIVE的组合。初始用户 通过从创建的目录中剥离最后一个目录组件来处理 上面导出的用户路径

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


open
失败的一个可能原因是您试图打开文件的目录不存在,或者您没有访问它的权限。

它崩溃的机器和它工作的机器之间有什么主要区别吗?我想不出什么。它在两台计算机上运行的2都有Windows 7,但它在其他Windows 7计算机和一台可用的Windows 8计算机上崩溃。任何用户都不可能更改任何计算机上的任何隐藏系统设置、环境变量等。他们持有正确的值,但我仍然收到此错误。@user268639我们可以获得更多详细信息吗?“坏”系统中这些变量的具体值是什么?@user268639同样重要的是,您是如何执行脚本的?直接从控制台?或者它是由其他应用程序启动的?如果OP没有写入权限,则会出现权限被拒绝的错误。很难收集详细信息,因为我只是要求朋友和同事运行该程序,而不是自己完全访问计算机。无论如何,在我的“好”系统上,HOME是None,USERPROFILE是C:\Users\MyName,HOMEPATH是\Users\MyName,HOMEDRIVE是C:。在其中一个“坏”系统上,它们完全相同(当然,更改了MyName)。
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:]
    import os
    for var in ('HOME', 'USERPROFILE', 'HOMEPATH', 'HOMEDRIVE'):
        print os.environ.get(var)