Unix 路径:在任何平台上正式使用 Python 工作?
-
06-07-2019 - |
题
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() - 它们。