Python os.path.split似乎返回错误

Python os.path.split似乎返回错误,python,windows,git-p4,Python,Windows,Git P4,我不明白os.path.split正在做什么。我正在调试一个程序(特别是git与Perforce:git-p4的接口),看到os.path.split正在以脚本不期望的方式分割传入路径,并且似乎与文档不一致。我做了一些更简单的测试,但我自己却不知道它在做什么 我想要分割的路径是//a/b(该路径实际上是一个Perforce路径,而不是本地文件系统路径),我需要在返回对的后半部分中使用b。我正在Windows上运行,怀疑问题与路径看起来不太像Windows有关。当我试着在一个在线沙箱中运行我的测试

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

我想要分割的路径是
//a/b
(该路径实际上是一个Perforce路径,而不是本地文件系统路径),我需要在返回对的后半部分中使用
b
。我正在Windows上运行,怀疑问题与路径看起来不太像Windows有关。当我试着在一个在线沙箱中运行我的测试代码时,它和我的Windows机器不一样

我已经阅读了文档:

os.path.split(路径) 将路径名路径拆分为一对(head,tail),其中tail是最后一个路径名组件,head是指向该组件的所有内容。尾部永远不会包含斜线;若路径以斜线结束,则尾部将为空。若路径中并没有斜线,头将是空的。如果路径为空,则头部和尾部都为空。除非是根(仅一个或多个斜线),否则尾部斜线将从头部剥离。在所有情况下,join(head、tail)都会返回一条路径,该路径与path位于同一位置(但字符串可能不同)。另请参见函数dirname()和basename()

我的测试代码: 我所期望的是: 我在两个在线沙盒上实际得到的是: 我在电脑上实际得到的信息: Python2,因为git-p4代码是为Python2编写的

所以我的第一个问题只是为了我自己的理解。这里怎么了?操作系统的不同


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

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

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

import posixpath

posixpath.split(yourpaths)
引述:

注意:由于不同的操作系统具有不同的路径名约定,因此标准库中有多个版本的此模块。
os.path
模块始终是适合Python运行的操作系统的路径模块,因此可用于本地路径。但是,如果要操纵始终采用不同格式之一的路径,也可以导入和使用各个模块。它们都有相同的接口:

  • posixpath
    用于UNIX样式的路径
  • ntpath
    用于Windows路径
  • [……]
在Windows上,
os.path
是与
ntpath
相同的模块,联机沙盒必须都是POSIX系统


如果您总是使用前斜杠作为路径分隔符,那么将Perforce路径视为POSIX路径是可以的。

后续:由于最初的错误不是在我的代码中发现的,而是在git-p4中发现的,解决方案跨平台是否足够值得向git开发人员建议?在我的Ubtu框中,Python3和Python2都返回您所期望的结果,在我的Win机器上,你得到的是你的。谢谢你的详细回答。这很有道理,将其更改为
posixpath
成功了,谢谢!我可能也会尝试将它提交给git开发,因为它听起来像是在任何平台上使用
posixpath
都是安全的。
('//', 'a')
('//a', 'b')
('//a/b', 'c')
('//', 'a')
('//a', 'b')
('//a/b', 'c')
('//', 'a')
('//a/b', '')
('//a/b/', 'c')
import posixpath

posixpath.split(yourpaths)