os.path.split 好像返回错误

os.path.split seems to be returning wrong

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

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

我已阅读文档:

os.path.split(路径)

Split the pathname path into a pair, (head, tail) where tail is the last pathname component and head is everything leading up to that. The tail part will never contain a slash; if path ends in a slash, tail will be empty. If there is no slash in path, head will be empty. If path is empty, both head and tail are empty. Trailing slashes are stripped from head unless it is the root (one or more slashes only). In all cases, join(head, tail) returns a path to the same location as path (but the strings may differ). Also see the functions dirname() and 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.

编写的

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

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

您使用了错误的工具来处理这些路径。在 Windows 上,以 //foo/bar\foo\bar 开头的路径被视为 UNC network paths, and os.path.split() will first use os.path.splitdrive() 以确保 UNC 部分未拆分。 UNC 或驱动器部分在分割剩余部分后是 re-attached。

您可以改用 posixpath 模块,以获得 POSIX 行为:

import posixpath

posixpath.split(yourpaths)

引自top of the os.path module documentation

Note: Since different operating systems have different path name conventions, there are several versions of this module in the standard library. The os.path module is always the path module suitable for the operating system Python is running on, and therefore usable for local paths. However, you can also import and use the individual modules if you want to manipulate a path that is always in one of the different formats. They all have the same interface:

  • posixpath for UNIX-style paths
  • ntpath for Windows paths
  • [...]

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

将您的 Perforce 路径视为 POSIX 路径是可以的,前提是您始终使用正斜杠作为路径分隔符。