如何在调用Python的os.getcwd()时获取正确的大小写?
当我在我的Mac上,使用OS X 10.6.4从我的主目录调用os.getcwd()时,路径会被转换成小写。我得到的是
/users/myusername
而不是
/Users/myusername
在另一台Mac上,我得到了正确的大写字符串。我该如何配置这个?有没有什么(隐藏的)Python设置?
问这个问题的原因是:
在OS X上,所有用户目录都在"/Users"下。这总是大写的。当我使用Mercurial时,有时会因为当前目录的这种奇怪和不正确的规范化而感到困惑。
关于建议的解决方案的回复:
(1) DiskUtil显示我的驱动器格式是"Mac OS Extended (Journaled)"。我几个月前买的电脑,还是原来的驱动器,从未重新格式化过。
(2) 另一个Python控制台会话的日志:
$>>> 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'
$>>> 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);
4 个回答
两个不太靠谱的猜测:
首先,OSX系统通常是不区分大小写的,这意味着它会保留字母的大小写:当前目录的名字要么是它在磁盘上的大小写样式,要么是你进入这个目录时的大小写。如果你运行 os.system('pwd')
,它显示的是小写还是大写呢?如果是小写,那就是系统这样报告的,Python并没有出错。如果你先运行 os.chdir('/UsErS/username')
,结果会变吗?
其次,有一个函数会根据操作系统选择性地处理大小写:os.path.normcase
。在Mac系统中,这个函数会把字母变成小写。我很确定 os.getcwd
并不会自动把结果通过这个函数处理;只是提一下,作为一个可以检查的地方。
“HFS plus”文件系统是苹果自Mac OS 8时代以来一直在用的文件系统,通常情况下它是不区分大小写的。
而Mac OS X 10.4版本,也就是大家常说的“Tiger”,引入了可以创建区分大小写的HFS plus文件系统的功能。
那么,他们中的某一个可能在使用区分大小写的文件系统吗?
最后发现问题出在Mercurial的安装上。我今晚又遇到了这个问题。
https://www.mercurial-scm.org/wiki/Download 这个链接提供了不同的安装Mercurial的方法。如果我选择第一个选项(Mac OS X的安装包),那么“/Users”这个目录会被显示成“/users”(即使用Objective C访问也是如此)。这个问题可以通过使用macports选项来安装Mercurial来解决。这样就能把“/Users”目录正确显示为大写的“U”了。
如果有人能提供为什么会发生这个问题的线索,那就太好了。
不过至少现在有了解决办法。