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

2023-12-02

我正在制作一个 python 桌面应用程序,它将日志作为 .csv 文件保存在 Windows 上用户的文档文件夹中。该应用程序是用 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:

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

正如你所看到的,代码非常简单(用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失败的原因可能是您尝试打开文件的目录不存在,或者您没有访问该文件的权限。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 os.path.expanduser 不返回主目录? 的相关文章

随机推荐

  • 在设定的时间从睡眠中唤醒应用程序

    我想让我的应用程序进入睡眠状态 然后在设定的时间唤醒它 我让它睡觉但不会醒来 这设置了唤醒锁 private void setWakeLock System out println wakelock PowerManager pm Powe
  • ReactJS、event.currentTarget 与 Vanilla Javascript 的行为不同

    我想知道是否有类似的事情event currentTargetReactJS中存 在问题 使用event targetonclick 是我得到的childDiv而不是parentDiv 普通 JavaScript 示例 document g
  • 如何使用 bash 脚本计算单词中最常出现的 3 个字母序列

    我有一个示例文件 例如 XYZAcc ABCAccounting Accounting firm Accounting Aco Accounting Acompany Acoustical consultant 这里我需要 grep 一个单
  • 根据一个向量对多个向量进行排序[重复]

    这个问题在这里已经有答案了 我有四个向量 其中包含圆心的 x y 半径和重量信息 我想按重量顺序对它们进行排序 从最高到最低 但我真的不知道如何或从哪里开始 我可以把所有的向量放在一个Eigen Tensor如果有帮助的话 将收集的数据保存
  • Jqgrid 许可证(具有 MIT/GPL v2)与 Guriddo jqGrid JS(知识共享许可证)

    我在网站应用程序的开发环境中使用 jqGrid 4 5 4 版本 并希望在商业网站上发布应用程序时使用相同的版本 我的疑问是 最近我看到了 Guriddo Jqgrid 4 7 1 的最新版本及其新许可证 知识共享许可 请告诉我现在可以在商
  • 如何使Code Runner在外部终端(命令提示符)中运行?

    所以 基本上Visual Studio Code中的Code Runner可以在集成终端中运行 我怎样才能让它在外部终端中运行 这是命令提示符 因为我需要向我的同学展示我的程序的输出 所以通过集成的终端显示它并不方便 我知道有一个像 Dev
  • C++ 中奇怪的 double 到 int 转换行为

    以下程序显示了我在 C 中看到的奇怪的 double 到 int 转换行为 include
  • Kafka 流过滤:代理端还是消费者端?

    我正在研究卡夫卡流 我想使用选择性非常低 几千分之一 的过滤器来过滤我的流 我正在看这个方法 https kafka apache org 0100 javadoc org apache kafka streams kstream KStr
  • 错误 LNK2001:wdk 中无法解析的外部符号 _fltused

    我试图在 C 代码中定义一个双数据类型变量 该变量将在 Windows 内核中使用 代码可以编译 但在链接时出错 我尝试在源文件中使用 libcntpr lib 并在代码中定义 fltused 变量 但无济于事 如果有人可以帮助我如何使用它
  • 过程控制问题

    为什么循环第一次没有结束collatz 返回 1 def collatz global number if number 2 0 number number 2 print number return number else number
  • 在面板中查找第一个非缺失字符串值并使用值按组转发和回填 (SAS aur PROC SQL)

    我有一个包含不平衡观察面板的数据集 我想在其中使用最新的非缺失字符串向前和向后填充缺失和 或 错误 的股票观察结果 id time ticker have ticker want 1 1 ABCDE YYYYY 1 2 YYYYY 1 3
  • 打印时 Html 表格断行

    我目前正在尝试打印的表格存在一些问题 如果它有多于一页 在分页符上 其中的表格行将被裁剪 我已经尝试过使用table page break inside auto and tr page break inside avoid page br
  • Fastlink 着陆页未呈现

    我正在致力于为我的应用程序实现用于聚合和 IAV 的 Fastlink 2 0 集成 我能够获取聚合和 IAV 的 oauth 令牌 但是当我使用它以及所需的参数来呈现 Fastlink 登录页面时 我得到的响应为 无法获取资源 我遵循的步
  • WPF 语音气泡

    我目前正在创建一个小软件 您可以在其中创建自己的漫画 我目前正在尝试添加气泡 我所做的是 我将一个文本框放在圆角边框内 这是我的结果 现在我想添加一个指向说话的角色的箭头 我想要得到的示例 箭头的位置应由用户选择 它想围绕边界旋转 我不知道
  • Python 数值积分与辛普森法则

    我已经开始学习这本书了 计算物理练习 5 4 及其练习 我遇到了以下问题 编写一个 Python 函数 J m x 使用 N 1000 个点的辛普森规则计算 Jm x 的值 在程序中使用您的函数在单个图形上绘制贝塞尔函数 J0 J1 和 J
  • Python正则表达式:如何仅增加字符串中的一个数字?

    我有以下类型的字符串 a1 images1subimages1 folder100 hello1 png a1 images1subimages1 folder100 hello1 png a1 images1subimages1folde
  • 每小时值总和

    我有一个具有以下结构和示例数据的表 STORE ID INS TIME TOTAL AMOUNT 2 07 46 01 20 3 19 20 05 100 4 12 40 21 87 5 09 05 08 5 6 11 30 00 12 6
  • Azure 流分析 - 应用窗口翻滚时自定义“时间戳”出错

    我有一个 json 文件 如下所示 imei imei 358174069248418F imeiBinary NYF0BpJIQY8 imeiNotEncoded 358174069248418 有效 1 dataPackets msy
  • 在 C# 中对对象的 ArrayList 进行排序

    我怎样才能排序ArrayList的物体 我已经实施了IComparable排序时的界面ArrayList 但我没有得到所需的结果 我的代码示例 public class Sort IComparable public string Coun
  • 为什么 os.path.expanduser 不返回主目录?

    我正在制作一个 python 桌面应用程序 它将日志作为 csv 文件保存在 Windows 上用户的文档文件夹中 该应用程序是用 python 2 7 和 kivy 1 8 0 编写的 使用 pyinstaller 2 1 打包为 Win