How can I get the correct case when calling Python's os.getcwd()?
当我从我的主目录在OS X 10.6.4下的Mac上调用os.getcwd()时,路径将转换为小写。我明白了
/用户/名为myUsername
代替
/用户/用户名为myusername
在另一台Mac上,我得到了正确的大写字符串。我该如何配置?是否有(隐藏的)Python设置?
询问理由:
在OS X上,所有用户目录都在"/ Users"中。这总是大写的。当使用Mercurial时,它有时会与我当前目录的这种奇怪和错误的规范化混淆。
在回复建议的解决方案时:
(1)
DiskUtil说我的驱动器格式为"Mac OS Extended(Journaled)"。我在几个月前买了我的电脑,它仍然是最初的驱动器,从未重新格式化。
(2)另一个python控制台会话日志:
$ >>> os.system('pwd')
/用户/克拉斯
0
$ >>> os.getcwd()"
"/用户/克拉斯"
$ >>> os.path.normcase('/ Users / klaas')
"/用户/克拉斯"
$ >>> os.chdir('/ UsErS / klaas')
$ >>> os.getcwd()
"/用户/克拉斯"
$ >>> os.chdir('/ UsErS / klaas')
$ >>> os.getcwd()
"/用户/克拉斯"
更新2:
感谢所有的答复。我在Objective-C中创建了一个测试用例,它具有相同的小写文件夹名称:
1 2 3 4 5 6 7 8
| NSFileManager *filemgr;
NSString *currentpath;
filemgr = [NSFileManager defaultManager];
currentpath = [filemgr currentDirectoryPath];
NSLog (@"Current directory is %@", currentpath); |
-
你安装了另一个python(通过macports还是fink)? 从控制台启动时,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的脚本。 至少你可以看到OS为目录返回的内容。
-
Python在darwin上报告Python 2.7(r27:82508,2010年7月3日,20:17:05)[GCC 4.0.1(Apple Inc. build 5493)]
-
用dtruss运行给我stat64("/ users / klaas 0",0xBFFFED24,0x87AC00)= 0 0 write_nocancel(0x1,"'/ users / klaas' n 0",0xF)= 15 0
-
两台主机都具有相同的操作系统版本(10.6.4 Build 10F569)并安装了所有更新。
-
所以你知道这不是Python的问题。 操作系统本身返回了一个小写/用户/ klass。
-
是的,我追查它,你在Objective-C得到相同的小写结果。
"HFS plus"文件系统,自Mac OS 8时代以来一直是Apple的文件系统,通常不区分大小写。
Mac OS X版本10.4,或称为"Tiger",因为它更为人所知,它引入了创建区分大小写的HFS plus文件系统的能力。
他们中的一个可能会使用区分大小写的FS吗?
最后,这是Mercurial安装的一个问题。我今晚再次遇到它。
https://www.mercurial-scm.org/wiki/Download为您提供了如何安装Mercurial的不同选项。如果我选择第一个(Mac OS X软件包),"/ Users"目录将报告为"/ users"(即使使用Objective C访问它)。这可以通过macports选项安装Mercurial来解决。这解决了问题,并再次使用大写的"U"返回"/ Users"目录。
任何提示,为什么会发生这种情况仍然是受欢迎的。
但至少有一个解决方案。
两个没有受过教育的猜测:
首先,显然OSX通常不区分大小写,这通常意味着保留大小写:当前目录的名称来自它在磁盘上的大小写,或者当你更改它时它是如何大写的。如果你运行os.system('pwd'),它是否显示小写?如果是这样,那就是操作系统报告的内容,而Python没有做错任何事情。如果你先os.chdir('/UsErS/username')它会改变吗?
其次,有一个函数可以根据操作系统小写或不选择:os.path.normcase。 macpath版本小写。我很确定os.getcwd不会自动运行结果;只是提到它作为一个检查的地方。
-
("通常",因为显然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调用以查看正在发生的事情。我只是没有看到任何可能小写结果的东西。
问题似乎是您在特定Mac上安装特定Python的问题。我无法找到有同样问题的其他人。
您的Mac很可能在安装Python时遇到问题。 AFAIK,没有配置选项让Python用正确的大小写表示getcwd()(默认情况下应启用此行为)。如果它是一个选项,我会尝试重新安装Python。如果这不起作用,您应该向Python bug跟踪器报告错误。
-
一个Python错误导致它以某种方式小写getcwd的返回值?这似乎不太可能 - 除非你确实有这方面的证据,建议重新安装Python似乎只是投掷飞镖,只会浪费他的时间。
-
@GlennMaynard看来他的Python安装可能有问题,因为他无法在另一台机器上重现这个问题。它可能是文件系统,但我遇到了与重新安装解决的Python安装类似的特性。
-
即使在奇怪的情况下,他应该弄清楚什么是错的,这样他就可以报告错误,而不是推土机解决问题并为下一个人留下一个谜。但是,在Modules / posixmodule.c中没有任何内容可以修改getcwd的结果。
-
我尝试使用python.org/ftp/python/2.7/python-2.7-macosx10.5.dmg重新安装,但问题仍然存在。正如其他人建议我使用dtruss登录,似乎操作系统返回错误的情况。