请考虑以下事项:
>>> 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运行。
为什么会发生这种情况,我该怎么办呢?
答案 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上,包括 以前的驱动器号,如果有一个)被丢弃,并加入 继续。 [...]