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

时间:2011-10-23 09:11:58

标签: python windows path operating-system

请考虑以下事项:

>>> 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/'

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

>>> 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运行。

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

2 个答案:

答案 0 :(得分:6)

这几乎是os.path.join定义的方式(引用docs):

  

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

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

答案 1 :(得分:4)

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

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

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

以下摘自os.path.join的文件:

  

智能地加入一个或多个路径组件。如果任何组件是   绝对路径,所有以前的组件(在Windows上,包括   以前的驱动器号,如果有一个)被丢弃,并加入   继续。 [...]