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

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 下工作)?

【问题讨论】:

  • 在 windows 上从来没有遇到过 / 的问题。

标签: python path portability relative-path


【解决方案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 它们。

        【讨论】:

          猜你喜欢
          • 2020-05-24
          • 2010-12-23
          • 2020-12-02
          • 2014-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-15
          • 2021-10-15
          相关资源
          最近更新 更多