考虑以下:
>>> 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上,包括上一个驱动器盘符,如果有的话)都会被丢弃,并继续连接。 […]