在Python中,适用于任何平台的Unix路径?
在Python程序中,所有路径都能使用“..”(表示上级目录)和“/”(用来分隔路径的部分),并且在任何平台上都能正常工作吗?
一方面,我在文档中从来没有看到过这样的说法(可能是我没注意到),而且os和os.path模块确实提供了一些工具,可以以不依赖平台的方式处理路径(比如os.pardir、os.path.join等),这让我觉得它们是有用的。
另一方面,你可以在StackOverflow上看到,使用“../path/to/file”在所有平台上都能正常工作……
那么,为了兼容性,os.pardir、os.path.join这些工具是否应该总是使用?还是说Unix路径名总是安全的(当然可能会有字符编码的问题)?或者说“几乎总是”安全(也就是说在Windows、OS X和Linux上都能工作)?
7 个回答
它在Windows上可以运行,所以如果你把“无论什么平台”定义为Unix和Windows,那就没问题。
另一方面,Python也可以在VMS、RISC OS和其他一些奇怪的平台上运行,这些平台使用完全不同的文件名规则。不过,试图让你的应用在VMS上运行,完全没有准备,这其实有点傻——“过早追求兼容性是一些相对小问题的根源”。
我喜欢使用os.path这个模块的函数,因为它们能很好地表达意图——与其说是简单的字符串拼接(这可以用来做很多事情),不如说它们明确地表示了路径的操作。
我在使用 ..
时从来没有遇到过什么问题,不过把它转换成绝对路径可能是个好主意,可以用 os.path.abspath 来实现。其次,我建议尽量使用 os.path.join 来连接路径。因为在连接路径时,有很多特殊情况(除了可移植性的问题),使用这个方法可以让你不用担心这些麻烦的事情。例如:
>>> '/foo/bar/' + 'qux'
'/foo/bar/qux'
>>> '/foo/bar' + 'qux'
'/foo/barqux'
>>> from os.path import join
>>> join('/foo/bar/', 'qux')
'/foo/bar/qux'
>>> join('/foo/bar', 'qux')
'/foo/bar/qux'
如果你在一些不常见的平台上使用 ..
,可能会遇到问题,但我说不出具体是哪些平台(Windows、*nix 和 OS X 都支持这种写法)。
“几乎总是安全的”这句话是对的。你关心的平台现在可能都能正常工作,我觉得它们的规则不会很快改变。
不过,Python是非常灵活的,它可以在很多不同的平台上运行。os
模块的作用就是帮助你处理那些平台可能有不同要求的情况。
你有没有什么特别的理由不使用os
的功能呢?
os.pardir
这个写法是自解释的,而".."
就不太容易理解,使用os.pardir
可能更容易在代码中查找。
这里有一些来自Python 1.6的文档,那时候Mac的系统和其他系统还很不一样:
根据我们使用的系统,适用的操作系统例程有Mac、DOS、NT或Posix。
这包括: - 从posix、nt、dos、os2、mac或ce导出的所有功能,比如unlink、stat等。 -
os.path
是posixpath、ntpath、macpath或dospath中的一个模块。 -os.name
可以是'posix'、'nt'、'dos'、'os2'、'mac'或'ce'。 -os.curdir
是一个表示当前目录的字符串('.'或':')。 -os.pardir
是一个表示父目录的字符串('..'或'::')。 -os.sep
是路径分隔符('/'或':'或'\')。 -os.altsep
是备用路径分隔符(None或'/')。 -os.pathsep
是用于$PATH等的组件分隔符。 -os.linesep
是文本文件中的行分隔符(' '或' '或' ')。 -os.defpath
是可执行文件的默认搜索路径。导入并使用
os
的程序在不同平台之间更具可移植性。当然,它们必须只使用所有平台都定义的功能(例如,unlink和opendir),并将所有路径操作留给os.path
(例如,split和join)。