Unix路径:在任何平台上正式使用Python?

时间:2009-10-27 21:01:06

标签: python path portability relative-path

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

一方面,我从未在文档中看到过这样的说法(我可能已经错过了它),os和os.path模块确实提供了以平台无关的方式处理路径的工具(os.pardir,os .path.join,...),让我觉得他们在这里是有原因的。

另一方面,您可以read on StackOverflow“../path/to/file”适用于所有平台......

那么,为了便于携带,是否应该使用os.pardir,os.path.join和朋友,或者Unix路径名是否始终安全(最多可能出现字符编码问题)?或者“几乎总是”安全(即在Windows,OS X和Linux下工作)?

7 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分: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”的程序更有可能存在   在不同平台之间移植。当然,他们必须这样做   使用由所有平台定义的函数(例如,取消链接和   opendir),并将所有路径名操作留给os.path(例如,拆分   并加入)。

答案 2 :(得分:3)

在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可能不起作用。

答案 3 :(得分:3)

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

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

Windows is more restrictive in the first two accounts(这是它有更多的禁用字符和更多特殊名称),而Unix通常区分大小写。这里有一些answers列出了这些字符和名称的确切内容。我会看看能否找到它们。

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

回答你的第一个问题,是../dir/file会有效,除非他们遇到上述某些不兼容问题。

答案 4 :(得分:3)

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

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

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

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