【问题标题】:How can I get the correct case when calling Python's os.getcwd()?调用 Python 的 os.getcwd() 时如何获得正确的大小写?
【发布时间】:2010-11-01 22:00:56
【问题描述】:

当我在 OS X 10.6.4 下的 Mac 上从主目录调用 os.getcwd() 时,路径将转换为小写。我明白了

/users/我的用户名

而不是

/用户/我的用户名

在另一台 Mac 上,我得到了正确的大写字符串。我该如何配置?是否有(隐藏的)Python 设置?

询问原因: 在 OS X 上,所有用户目录都在“/Users”中。这总是大写。使用 Mercurial 时,它有时会与我当前目录的这种奇怪且不正确的规范化混淆。

回复建议的解决方案:

(1) DiskUtil 说我的驱动器的格式为“Mac OS Extended (Journaled)”。一个月前我买了我的电脑,它仍然是原始驱动器,从未重新格式化。

(2)另一个python控制台会话日志:

$>>> os.system('pwd')

/用户/klaas

0

$>>> os.getcwd()"

'/users/klaas'

$>>> os.path.normcase('/Users/klaas')

'/Users/klaas'

$>>> os.chdir('/UserS/klaas')

$>>> os.getcwd()

'/users/klaas'

$>>> os.chdir('/UserS/klaas')

$>>> os.getcwd()

'/users/klaas'

更新 2:

感谢所有回复。我在 Objective-C 中创建了一个测试用例,它具有相同的小写文件夹名称:

NSFileManager *filemgr;
NSString *currentpath;

filemgr = [NSFileManager defaultManager];

currentpath = [filemgr currentDirectoryPath];

NSLog (@"Current directory is %@", currentpath);

【问题讨论】:

  • 您是否安装了另一个python(通过macportsfink)?当您从控制台启动 Python 时,它会报告什么版本?我的系统Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) - [GCC 4.2.1 (Apple Inc. build 5646)] on darwin 工作正常...
  • 主机的操作系统版本是否相同并使用相同的文件系统?
  • 尝试使用“dtruss”运行带有 os.getcwd 的脚本。至少您可以看到操作系统为该目录返回的内容。
  • Python 在 darwin 上报告 Python 2.7 (r27:82508, Jul 3 2010, 20:17:05) [GCC 4.0.1 (Apple Inc. build 5493)]
  • 所以你知道这不是 Python的问题。操作系统本身返回一个小写的 /users/klass。

标签: python macos


【解决方案1】:

“HFS plus”文件系统自 Mac OS 8 以来一直是 Apple 的首选文件系统,通常不区分大小写。

Mac OS X 版本 10.4 或更常见的“Tiger”引入了创建区分大小写的 HFS plus 文件系统的功能。

其中一个可能正在使用区分大小写的 FS?

【讨论】:

    【解决方案2】:

    问题似乎是您在特定 Mac 上安装的特定 Python 存在问题。我无法找到其他有同样问题的人。

    您的 Mac 可能在安装 Python 时出现问题。 AFAIK,没有配置选项可以使 Python 以正确的大小写代表 getcwd()(默认情况下应启用此行为)。如果可以的话,我会尝试重新安装 Python。如果这不起作用,您应该向Python bug tracker 报告错误。

    【讨论】:

    • 一个 Python 错误导致它以某种方式将getcwd 的返回值小写?这似乎不太可能——除非你确实有证据证明这一点,否则建议重新安装 Python 似乎是在扔飞镖,只会浪费他的时间。
    • @GlennMaynard 似乎他的 Python 安装有问题,因为他无法在另一台机器上重现该问题。它可能是文件系统,但我遇到过类似的 Python 安装问题,但通过重新安装解决了。
    • 即使在奇怪的情况下,他也应该找出问题所在,这样他就可以报告错误,而不是推倒问题并把它留给下一个人。但是,Modules/posixmodule.c 中没有任何内容可以修改 getcwd 的结果。
    • 我尝试使用 python.org/ftp/python/2.7/python-2.7-macosx10.5.dmg 重新安装,但问题仍然存在。正如其他人建议的那样,我使用 dtruss 登录,似乎操作系统返回了错误的情况。
    【解决方案3】:

    两个没有根据的猜测:

    首先,显然 OSX 通常不区分大小写,这通常意味着保留大小写:当前目录的名称要么来自它在磁盘上的大小写方式,要么来自您更改为它时的大小写方式。如果你运行os.system('pwd'),它是否显示为小写?如果是这样,那么这就是操作系统报告的内容,而 Python 没有做错任何事情。如果你先os.chdir('/UsErS/username'),它会改变吗?

    其次,有一个函数可以根据操作系统选择小写或不选择小写:os.path.normcasemacpath 版本是小写的。我很确定os.getcwd not 会自动运行结果;只是提到它作为一个检查的地方。

    【讨论】:

    • (“通常”,因为显然 HFS+ 可以设置为区分大小写或不区分大小写;我认为通常是。bugs.python.org/issue3485。另外,我不知道“macpath”是否适用于 OSX 或如果它是挥之不去的 MacOS 垃圾;如果是后者,那么那部分可能不相关。)
    • 是的,“macpath”适用于 MacOS;忽略它。
    • DiskUtil 说我的驱动器格式为“Mac OS Extended (Journaled)”。一个月前我买了我的电脑,它仍然是原来的驱动器,从未重新格式化。
    • 我也尝试了你的其他建议:>>> os.system('pwd') /Users/klaas 0 >>> os.getcwd() '/users/klaas' >>> os .path.normcase('/Users/klaas') '/Users/klaas' >>> os.chdir('/Users/klaas') >>> os.getcwd() '/users/klaas'
    • 我不知道;此时,我将通过调试编译 Python 源代码并跟踪 getcwd 调用以查看发生了什么。我只是没有看到任何可以小写结果的内容。
    【解决方案4】:

    最后,这是 Mercurial 安装的问题。今晚我又遇到了。

    https://www.mercurial-scm.org/wiki/Download 为您提供了安装 Mercurial 的不同选项。如果我选择第一个(Mac OS X 软件包),“/Users”目录将被报告为“/users”(即使使用 Objective C 访问它时)。这可以通过 macports 选项安装 Mercurial 来解决。这解决了这个问题,并且“/Users”目录再次返回一个大写的“U”。

    仍然欢迎任何提示为什么会发生这种情况。

    但至少有一个解决方案。

    【讨论】:

      猜你喜欢
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2020-03-06
      • 1970-01-01
      相关资源
      最近更新 更多