python os.path.join в windows игнорирует первый элемент пути? - PullRequest
3 голосов
/ 23 октября 2011

Рассмотрим следующее:

>>> 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) с собственным питоном.

Почему это происходит, и что я могу с этим поделать?

Ответы [ 2 ]

6 голосов
/ 23 октября 2011

Примерно так определяется os.path.join (цитируя документы ):

Если какой-либо компонент является абсолютным путем, все предыдущие компоненты (в Windows, включая предыдущую букву диска, если она была) отбрасываются

И я бы сказал, что это, как правило, хорошо, так как избегает создания неверных путей. Если вы хотите избежать такого поведения, не указывайте в нем абсолютные пути. Да, начало с косой черты квалифицируется как абсолютный путь. Быстрое и грязное решение - просто удалить начальный слеш (settings.EXTRA_BASE.lstrip('/'), если вы хотите сделать это программно).

4 голосов
/ 23 октября 2011

Удалите начальную / из второй строки:

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

Это потому, что os.path.join отбрасывает все предыдущие компоненты, как только встречает абсолютный путь, а /oneclickos/ - абсолютпуть .

Вот выдержка из документа os.path.join:

Соедините один или несколько компонентов пути с умом.Если какой-либо компонент является абсолютным путем, все предыдущие компоненты (в Windows, включая предыдущую букву диска, если она была) отбрасываются, и объединение продолжается.[...]

...