【问题标题】:python os.path.expanduser() Is this always truepython os.path.expanduser() 这总是真的吗
【发布时间】:2012-12-15 16:24:27
【问题描述】:

解决方案:正如 Thomas 在下面指出的那样,我得到的任务几乎是不可能实现的,并且必须动态确定数据,因为任何操作系统使用的模板结构都可以很容易地被覆盖,并且有永远无法保证可以正确应用预构建的模板。感谢所有回复的人(即使我一开始就很密集......):-P

我目前无法访问基于 Mac 或 Windows 的机器,我正在开发一个跨平台项目 (Win/Lin/Mac)。

在 linux 上,调用返回

os.path.expanduser('~')

返回/home/<user>

现在在任何操作系统中,$home 目录结构都包含一个对所有路径都通用的最后一点,(在我的 linux 安装上,home 路径默认为 /home/<user>,使 /home 成为最后一个通用点)。

所以我的问题(我现在不能简单地测试)是这样的: 在 windows 和 mac 上,除非进行一些不寻常的重新配置(软件产品适用于普通家庭用户和青少年),否则返回路径的最后部分总是第一个非公共路径部分?

(这个问题可以说得更清楚,但我很困惑如何解释。这是重写三。)

编辑:在阅读了 phihag 在下面的 cmets 中链接的文章后,我认为他要求更好地澄清我的预期用途(不可能的规范事情)。 我想要做的是确定来自os.path.expanduser('~') 的返回部分,我可以将其转换为新的相对路径定义的第一部分,然后我可以从中创建更多的目录结构,这些目录结构是针对每个用户的应用程序特定的。相当于/home/<user>/.config/<MyAppHere>\Documents and Settings\<user>\Application Data\Roaming\<MyAppHere>。我的最终结果将使用(如果我的意图可以确定这个问题为真)以下内容:

# Assumes linux system and home path of /home/<user
head, tail = os.path.split(os.path.expanduser('~'))
userConfigPath = os.path.join(tail,'.config',MYAPPNAME)

# userConfigPath then gets written to a config file which is used by the program
# to determine where (within a greater structure) to look for a user based
# configuration which expands or overrides system configuration options.

编辑:与 Thomas Orozco 交换信息后(下): 在软件执行的这个阶段,它不知道在哪里寻找自定义用户配置。从配置文件中读取的不是绝对地址,而是如何为配置文件构建绝对地址的模板。

有问题的软件与视频游戏有关,目标用户群是使用标准家用电脑的青少年或成年人。这些用户中的大多数不使用特殊配置选项,例如自定义主用户目录位置。这部分代码适用于任何操作系统的所谓规范,并且忽略了对相关操作系统进行定制的可能性。虽然以编程方式是不好的做法,但这是我目前所坚持的。

【问题讨论】:

  • 我不认为这是真的。在 Windows 中有 RDS,主目录最终位于奇怪的地方。
  • 在(几乎所有)Linux 机器上甚至都不是这样。即使挂载/home失败,root也必须能够登录;因此,~root 通常只是 /root。你能描述一下你的首要问题吗?无意冒犯,但请注意breaking down the problem into two parts, one easy and one impossible 的常见谬误。
  • @Guy 什么是 RDS? @phihag 程序拒绝以 root 身份运行(现在阅读您的链接)

标签: python windows macos python-2.7


【解决方案1】:

在 Linux 上甚至不是这样。看看/etc/adduser.conf

  • GROUPHOMES=yes 会让 adduser 创建房屋,例如:/home/groupname/user.
  • LETTERHOMES=yes 会创建类似:/home/u/user

这只是默认设置。你可以把你家放在任何你喜欢的地方。


关于您要实现的目标,为什么以下内容不合适?

from os.path import join, expanduser
join(expanduser('~'), '.config') # You could have something more funky if you want to. 

然后,只需在应用程序运行时即时计算此路径,无需将其硬编码到您的应用程序中。

【讨论】:

  • 您在代码中提出的建议与我想要实现的目标很接近。但是,我试图从最终结果中删除用户主目录路径的第一部分。您的代码(插入我上面的示例)会给/home/&lt;user&gt;/.config 我想要结束的是&lt;user&gt;/.config 有效地将其从完全合格的路径转换为相对路径。
  • @Jase 但是为什么你想这样做?您要查找的路径是~/.config
  • 配置文件慢慢构建软件使用的路径结构。所以在一个地方,我有一个值将/homec:\Documents and Settings 设置为家庭结构的系统骨架。另一行将%(baseHome)s/&lt;user&gt;/.config 设置为其自定义配置位置。
  • @Jase 好吧,首先将问题分解为这两部分可能不是一个好主意。没有“家庭结构的系统骨架”之类的东西,你不能保证%(baseHome)s/&lt;user&gt;/.config 会是&lt;user&gt; 的家(即使baseHome 恰好是你想要的)。跨度>
  • @Jase 必须为您的模板提供主目录的完整路径,而不仅仅是用户名。
猜你喜欢
  • 2014-08-02
  • 2020-09-22
  • 2022-06-13
  • 2010-10-20
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 2018-01-22
相关资源
最近更新 更多