代码之家  ›  专栏  ›  技术社区  ›  Eric O. Lebigot

Unix路径:在任何平台上都可以在Python中正式工作?

  •  10
  • Eric O. Lebigot  · 技术社区  · 16 年前

    python程序中的所有路径都可以使用“..”(用于父目录)和/(用于分隔路径组件),并且仍然可以工作吗? 不管平台是什么 ?

    一方面,我从未在文档中看到过这样的声明(我可能错过了),并且OS和OS.path模块确实提供了以平台不可知的方式(OS.pardir、OS.path.join、_)处理路径的工具,这让我认为它们在这里是有原因的。

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

    那么,应该始终使用os.pardir、os.path.join和friends来实现可移植性,还是使用unix路径名始终是安全的(最多可能出现字符编码问题)?或者“几乎总是”安全(即在Windows、OS X和Linux下工作)?

    7 回复  |  直到 12 年前
        1
  •  6
  •   Ranjith Ramachandra    12 年前

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

    然而,python是非常可移植的,运行在比通常平台多得多的平台上。原因是 os 模块是为了帮助您在IT上顺利完成工作,平台确实有不同的要求。

    你有没有充分的理由不使用 操作系统 功能?

    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(例如split 并加入。

        2
  •  11
  •   Jason Baker    16 年前

    我从来没有使用过任何问题 .. ,尽管使用 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都支持这个符号)。

        3
  •  3
  •   mob    16 年前

    在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文件名。

        4
  •  3
  •   Jack Lloyd    16 年前

    它在Windows上工作,所以如果你把“无论什么平台”定义为Unix和Windows,你就没事了。

    另一方面,python也运行在vms、risc操作系统和其他使用完全不同文件名约定的奇怪平台上。然而,试图让应用程序在虚拟机上运行很可能是愚蠢的,不管怎样,“过早的可移植性是一些相对次要的缺点的根源。”

    不管怎样,我喜欢使用os.path函数,因为它们很好地表达了意图——而不仅仅是字符串串联(这可能用于一百万个目的中的任何一个),它非常明确地读作路径操作。

        5
  •  3
  •   Community Mohan Dere    9 年前

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

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

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

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

    回答你的第一个问题,是的 ../dir/file 将有效,除非它们碰到了上面提到的一些不兼容性。

        6
  •  1
  •   Mark Ransom    16 年前

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

    我不知道还有多少其他平台移植了python,我不能代表它们说话。

        7
  •  0
  •   jcdyer Anand S Kumar    16 年前

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