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

Mar*_*cin 3 python windows operating-system 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/'
Run Code Online (Sandbox Code Playgroud)

你可以想像,我指望或希望的串联'C:/Users/Marcin/Documents/oneclickcos''/oneclickcos/''/oneclickcos/'.

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

>>> os.path.join(settings.EXTRA_BASE,settings.VIRTUAL_ENV)
'C:/Users/Marcin/Documents/oneclickcos'
Run Code Online (Sandbox Code Playgroud)

虽然这有点像预期的:

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

我当然是在Windows(Windows 7)上使用本机python运行的.

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

小智 6

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

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

我会说它通常是一件好事,因为它避免了创建无效路径.如果要避免此行为,请不要为其提供绝对路径.是的,从斜杠开始有资格作为绝对路径.快速而肮脏的解决方案就是删除前导斜杠(settings.EXTRA_BASE.lstrip('/')如果您想以编程方式执行).

  • 如果你问我,这根本不矛盾.从目录分隔符开始意味着在许多(所有?)其他平台上的绝对路径.您可能会反对缺少驱动器号,但我的记忆和[维基百科](http://en.wikipedia.org/wiki/Path_%28computing%29#MS-DOS.2FMicrosoft_Windows_style)表示它完全有效且只是引用在同一个驱动器上的绝对路径. (2认同)