10

Python 程序中的所有路径都可以使用“..”(用于父目录)和 /(用于分隔路径组件),并且在任何平台上都可以工作吗?

一方面,我从未在文档中看到过这样的声明(我可能错过了),并且 os 和 os.path 模块确实提供了以与平台无关的方式处理路径的工具(os.pardir、os.path.加入,...),这让我觉得他们来这里是有原因的。

另一方面,您可以在 StackOverflow 上看到“../path/to/file”适用于所有平台……</p>

那么,出于可移植性目的,是否应该始终使用 os.pardir、os.path.join 和朋友,或者 Unix 路径名是否总是安全的(取决于可能的字符编码问题)?或者也许“几乎总是”安全(即在 Windows、OS X 和 Linux 下工作)?

4

7 回答 7

11

我从来没有遇到过 using 的任何问题,尽管使用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 都支持这种表示法)。

于 2009-10-27T21:13:19.047 回答
6

“几乎总是安全的”是对的。您关心的所有平台今天可能都可以正常工作,我认为他们不会很快改变他们的惯例。

然而,Python 非常便携,并且可以在比通常平台更多的平台上运行。该os模块的原因是为了帮助平滑它,一个平台确实有不同的要求。

您是否有充分的理由不使用这些os功能?

os.pardir是自我记录,而".."不是,并且 os.pardir 可能更容易 grep

这是 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 是备用路径名分隔符(无或“/”) - os.pathsep 是 $PATH 等中使用的组件分隔符 - os.linesep 是文本文件中的行分隔符(' ' 或 ' ' 或 ' ') - os.defpath 是默认搜索可执行文件的路径

导入和使用“os”的程序更有可能在不同平台之间移植。当然,他们必须只使用所有平台定义的函数(例如,unlink 和 opendir),并将所有路径名操作留给 os.path(例如,split 和 join)。

于 2009-10-27T21:48:56.083 回答
3

在 python 中,使用/将始终有效。如果要在子 shell 中执行命令,则需要了解操作系统约定

myprog = "/path/to/my/program"
os.system([myprog, "-n"])                           # 1
os.system([myprog, "C:/input/file/to/myprog"])      # 2

命令 #1 可能会按预期工作。如果命令 #2是 Windows 命令并希望解析其命令行参数以获取 Windows 文件名,
则命令 #2 可能不起作用。myprog

于 2009-10-27T21:12:40.920 回答
3

Windows 支持/作为路径分隔符。Unix 文件名和 Windows 文件名之间唯一的不兼容是:

  • 文件名中允许的字符
  • 特殊名称和
  • 区分大小写

Windows 对前两个帐户的限制更大(也就是说,它有更多的禁止字符和更多的特殊名称),而 Unix 通常区分大小写。这里有一些答案准确列出了这些字符和名称。我看看能不能找到他们。

现在,如果您的开发环境带有创建或操作路径的功能,您应该使用它,它的存在是有原因的,你知道的。特别是考虑到平台比 Windows 和 Unix 多得多。

回答你的第一个问题,肯定../dir/file会起作用,除非他们遇到了上面提到的一些不兼容性。

于 2009-10-27T21:12:50.887 回答
3

它可以在 Windows 上运行,因此如果您将“任何平台”定义为 Unix 和 Windows,就可以了。

另一方面,Python 也可以在 VMS、RISC OS 和其他使用完全不同文件名约定的奇怪平台上运行。然而,试图让你的应用程序在 VMS 上运行,盲目的,这很可能有点愚蠢——“过早的可移植性是一些相对较小的邪恶的根源”

无论如何,我都喜欢使用 os.path 函数,因为它们很适合表达意图 - 而不仅仅是一个字符串连接,这可能用于一百万个目的中的任何一个,它非常明确地读取为路径操作。

于 2009-10-27T21:16:30.600 回答
1

OS/X 和 Linux 都与 Unix 兼容,因此根据定义,它们使用您在问题开头给出的格式。除了“\”之外,Windows 还允许使用“/”,以便程序可以与 Xenix 互换,Xenix 是微软很久以前尝试的 Unix 变体,并且这种兼容性一直延续到现在。因此它也有效。

我不知道 Python 被移植到了多少其他平台,我也不能代表它们。

于 2009-10-27T21:12:14.400 回答
0

正如其他人所说,正斜杠在所有情况下都可以使用,但你最好创建一个路径段列表并 os.path.join()-ing 它们。

于 2009-10-27T21:19:00.033 回答