在Windows上的python os.path.join忽略第一个path元素?

考虑以下:

>>> from django.conf import settings >>> import os >>> settings.VIRTUAL_ENV 'C:/Users/Marcin/Documents/oneclickcos' >>> settings.EXTRA_BASE '/oneclickcos/' >>> os.path.join(settings.VIRTUAL_ENV,settings.EXTRA_BASE) '/oneclickcos/' 

可以想象,我既不期望也不希望'C:/Users/Marcin/Documents/oneclickcos''/oneclickcos/'连接成为'/oneclickcos/'

奇怪的是,反转path组件再次显示python忽略第一个path组件:

 >>> os.path.join(settings.EXTRA_BASE,settings.VIRTUAL_ENV) 'C:/Users/Marcin/Documents/oneclickcos' 

虽然这工作像预期的那样:

 >>> os.path.join('/foobar',settings.VIRTUAL_ENV,'barfoo') 'C:/Users/Marcin/Documents/oneclickcos\\barfoo' 

我当然是在Windows(Windows 7)上运行本地python。

为什么会发生这种情况,我该怎么办?

这几乎是如何定义os.path.join (引用文档 ):

如果任何组件是绝对路径,则以前的所有组件(在Windows上,包括上一个驱动器号,如果有的话)都被丢弃

我会说这通常是一件好事,因为它避免了创建无效路径。 如果你想避免这种行为,不要给它绝对路径。 是的,从斜线开始符合绝对路径。 一个快速和肮脏的解决方案就是删除前导斜杠( settings.EXTRA_BASE.lstrip('/')如果你想以编程方式)。

从第二个字符串中删除前导/

 >>> os.path.join('C:/Users/Marcin/Documents/oneclickcos', 'oneclickos/') 'C:/Users/Marcin/Documents/oneclickcos\\oneclickos/' 

这是因为os.path.join一旦遇到绝对路径就丢弃所有以前的组件,而/oneclickos/ 是绝对路径

以下是os.path.join文档的摘录:

加入一个或多个路径组件智能。 如果任何组件是绝对路径,则以前的所有组件(在Windows上,包括上一个驱动器盘符,如果有的话)都会被丢弃,并继续连接。 […]