【问题标题】:os.path.split seems to be returning wrongos.path.split 似乎返回错误
【发布时间】:2018-08-22 02:16:18
【问题描述】:

我不明白os.path.split 在做什么。我正在调试一个程序(特别是 git 与 Perforce 的接口:git-p4)并看到 os.path.split 正在以脚本不期望的方式分割传入路径,并且似乎与文档不一致。我做了一些更简单的测试,但自己无法弄清楚它在做什么。

我要拆分的路径是//a/b(该路径实际上是Perforce路径,而不是本地文件系统路径),我需要在返回对的后半部分使用b。我在 Windows 上运行,并且怀疑这个问题与看起来不太像 Windows 的路径有关。当我尝试在在线沙盒中运行我的测试代码时,它与我的 Windows 机器不同,它按预期运行。

我已阅读文档:

os.path.split(路径)

将路径名路径分成一对,(head, tail),其中 tail 是最后一个路径名组件,而 head 是导致该路径的所有内容。尾部永远不会包含斜线;如果路径以斜线结尾,则尾部将为空。如果路径中没有斜线,head 将为空。如果 path 为空,则 head 和 tail 都为空。尾部的斜线被从头部去除,除非它是根(一个或多个斜线)。在所有情况下,join(head, tail) 返回与 path 相同位置的路径(但字符串可能不同)。另请参阅函数 dirname() 和 basename()。

我的测试代码:

import os
print os.path.split("//a")
print os.path.split("//a/b")
print os.path.split("//a/b/c")

我的期望:

('//', 'a')
('//a', 'b')
('//a/b', 'c')

我实际上在几个在线沙盒上得到了什么:

('//', 'a')
('//a', 'b')
('//a/b', 'c')

我在 PC 上实际得到的结果:

('//', 'a')
('//a/b', '')
('//a/b/', 'c')

Python 2,因为 git-p4 代码是为 Python 2 编写的。

所以我的第一个问题只是为了我自己的理解。这里出了什么问题?操作系统差异?

然后超出我自己的好奇心,我需要修复。我已经能够修改 git-p4,但我当然更愿意尽可能少地编辑它,因为我不想理解它!我不是蟒蛇专家。有没有类似的方法可以返回('//a', 'b')

【问题讨论】:

  • 后续:由于最初的 bug 不是在我的代码中而是在 git-p4 中发现的,因此该解决方案是否足够跨平台,值得推荐给 git 开发?
  • 在我的 Ubtu 盒子上,Python3Python2 都会返回你所期望的,而在我的 机器你得到什么。

标签: python windows git-p4


【解决方案1】:

您使用了错误的工具来处理这些路径。在 Windows 上,以//foo/bar\\foo\bar 开头的路径被视为UNC network pathsos.path.split() 将首先使用os.path.splitdrive() 以确保UNC 部分不被拆分。 UNC 或驱动器部分在拆分其余部分后重新连接。

您可以改用 posixpath 模块来获取 POSIX 行为:

import posixpath

posixpath.split(yourpaths)

引用top of the os.path module documentation:

注意:由于不同的操作系统有不同的路径名约定,标准库中有这个模块的几个版本。 os.path 模块始终是适用于 Python 正在运行的操作系统的路径模块,因此可用于本地路径。但是,如果您想操作始终采用其中一种不同格式的路径,您也可以导入和使用各个模块。它们都有相同的界面:

  • posixpath 用于 UNIX 样式路径
  • ntpath 用于 Windows 路径
  • [...]

在 Windows 上,os.pathntpath 是同一个模块,在线沙箱必须都是 POSIX 系统。

只要您始终使用正斜杠作为路径分隔符,将您的 Perforce 路径视为 POSIX 路径即可。

【讨论】:

  • 感谢您的详尽回答。这很有意义,将其更改为 posixpath 就成功了,谢谢!我可能也会尝试将其提交给 git development,因为听起来在任何平台上使用 posixpath 都是安全的。
猜你喜欢
  • 1970-01-01
  • 2023-03-14
  • 2014-04-04
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 2012-07-12
相关资源
最近更新 更多