Python程序中的所有路径都可以使用“..”(用于父目录)和/(用于分隔路径组件),并且仍然有效 无论什么平台?

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

另一方面,你可以 在 StackOverflow 上阅读 “../path/to/file”适用于所有平台......

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

有帮助吗?

解决方案

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

然而,Python非常便携,并且比通常的平台运行得更多。 os 模块的原因是为了帮助平滑事物平台确实有不同的要求。

你有充分的理由不使用 os 函数吗?

os.pardir 是自我记录的,而" .." 则不是,而os.pardir可能更容易grep for

以下是来自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”的程序更有可能存在   在不同平台之间移植。当然,他们必须这样做   使用由所有平台定义的函数(例如,取消链接和   opendir),并将所有路径名操作留给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中,使用 / 将始终有效。如果要在子shell中执行命令,则需要了解OS约定

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

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

它可以在Windows上运行,因此如果您定义“无论平台是什么”,要成为Unix和Windows,你没事。

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

我喜欢使用os.path函数,因为它们有利于表达意图 - 而不仅仅是一个字符串连接,它可以用于任何一百万个目的,它非常明确地读作路径操作。

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

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

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

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

回答你的第一个问题,是的 ../dir/file 将会起作用,除非它们遇到了上述的一些不兼容问题。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top