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下工作)?
答案 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() - 它们。