适用于 Python 中任何平台的 Unix 路径?

Posted

技术标签:

【中文标题】适用于 Python 中任何平台的 Unix 路径?【英文标题】:Unix paths that work for any platform in Python? 【发布时间】:2010-12-10 15:46:27 【问题描述】:

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

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

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

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

【问题讨论】:

在 windows 上从来没有遇到过 / 的问题。 【参考方案1】:

我在使用.. 时从未遇到任何问题,尽管使用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 都支持该表示法)。

【讨论】:

【参考方案2】:

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

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

您是否有充分的理由不使用os 函数?

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

这里有一些来自 python 1.6 的文档,当时 Mac 在所有方面仍然不同

适用于 Mac、DOS、NT 或 Posix 的操作系统例程,具体取决于我们使用的系统 开。

这会导出: - 来自 posix、nt、dos、os2、mac 或 ce 的所有函数,例如取消链接,统计等 - 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 是文本文件中的行分隔符(' ' or ' ' or ' ') - os.defpath 是可执行文件的默认搜索路径

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

【讨论】:

我想绕过os.path和co的原因。是写“../dir1/dir2/dir3/file”而不是使用 os.path.join(os.pardir, ['dir1', 'dir2', 'dir3', 'file '])! @EOL 我想不出太多真正的程序需要它。也许将这样的路径移到配置文件中是有意义的。 @gnibbler 我的程序分析数千组数据,并将结果存储在常规位置,其中目录名称是根据每个数据集的“名称”计算的。但是,是的,os.path.join(os.pardir,…) 几乎和直接路径编码一样短。 Windows 上的 Python 在某处记录的路径中接受“/”这一事实吗?我找不到这个…… @EOL,它不是 Python - 它在 windows api"注意 Windows API 中的文件 I/O 函数将“/”转换为“\”作为将名称转换为 NT-样式名称,除非使用以下部分中详述的“\\?\”前缀。”【参考方案3】:

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

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

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

【讨论】:

只是一个旁注——永远不要使用os.system 来运行程序。它需要一个字符串(不是您使用的列表),并且不必要地调用一个 shell。请改用subprocess 模块。【参考方案4】:

它适用于 Windows,所以如果您将“任何平台”定义为 Unix 和 Windows,就可以了。

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

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

【讨论】:

【参考方案5】:

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

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

Windows is more restrictive in the first two accounts(也就是说,它有更多的禁止字符和更多的特殊名称),而 Unix 通常区分大小写。这里有一些answers 列出了这些字符和名称的确切含义。我看看能不能找到。

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

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

【讨论】:

不要忘记区分大小写的区别。【参考方案6】:

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

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

【讨论】:

【参考方案7】:

正如其他人所说,正斜杠适用于所有情况,但您最好创建一个路径段列表并 os.path.join()-ing 它们。

【讨论】:

以上是关于适用于 Python 中任何平台的 Unix 路径?的主要内容,如果未能解决你的问题,请参考以下文章

在Unix / Linux平台上查找os名称和版本的最佳方法

如何在Python中将用户输入转换为文件路径

python的环境搭建

如何实现一个简单的跨平台 Python 守护进程?

Flutter 是不是适用于任何 Android 平台版本?

如何系统地学习Python 中 matplotlib,numpy,scipy,pandas