Документация, описывающая поведение os.chdir для окон python?

Сегодня я узнал, что в Python для Windows выполнение os.chdir('f:\\') сильно отличается от выполнения os.chdir('f:'). Команда с обратной косой чертой на самом деле изменяет текущий каталог. Без обратной косой черты команда похожа на ввод f: в командной строке и изменяет текущий каталог на последний текущий каталог на диске f.

Вот пример:

import time
import os
if __name__ == '__main__':
    os.chdir('f:\\directory')
    print 'cwd is {}'.format(os.getcwd())
    os.chdir('d:\\directory')
    print 'cwd is {}'.format(os.getcwd())
    os.chdir('f:')
    print 'cwd is {}'.format(os.getcwd())
    os.chdir('f:\\')
    print 'cwd is {}'.format(os.getcwd())

отпечатки

cwd is f:\directory
cwd is d:\directory
cwd is f:\directory
cwd is f:\

Я могу понять, почему эта разница полезна, но не смог найти ничего, документирующего это поведение. Я привык оставлять косые черты в конце своих каталогов, поскольку я обычно использую здесь строки...

Это поведение где-нибудь задокументировано? Могу ли я рассчитывать на то, что он не изменится?


person aggieNick02    schedule 19.07.2018    source источник
comment
Это не функция Python, это функция Windows. В Windows каждый диск имеет свой собственный рабочий каталог, поэтому F: означает текущий рабочий каталог диска F, а `F:\` означает корневой каталог диска F.   -  person abarnert    schedule 20.07.2018
comment
Кроме того, это не относится к chdir. Если вы open('F:spam.txt'), вы получите spam.txt в текущем рабочем каталоге F, но open('F:\\spam.txt') вы получите spam.txt в корневом каталоге F.   -  person abarnert    schedule 20.07.2018
comment
Это особенность Windows. А документация Python предназначена для кросс-платформенной работы, поэтому большинство подробностей об операционных системах, на которых он может работать, не обсуждаются.   -  person Rory Daulton    schedule 20.07.2018
comment
@abarnert: эти 2 комментария дают прекрасный ответ, особенно первый. (Помимо «Могу ли я полагаться на то, что это не изменится», я имею в виду, кто может сказать, что Microsoft сломает в своей недавно анонсированной «улучшенной» консоли.)   -  person Jongware    schedule 20.07.2018


Ответы (2)


В документации упоминается такое поведение для другой функции в том же модуле. Вероятно, можно с уверенностью предположить, что они будут обрабатываться одинаково:

Обратите внимание, что поскольку для каждого диска существует текущий каталог, os.path.join("c:", "foo") представляет собой путь относительно текущего каталога на диске C: (c:foo), а не c:\foo.

https://docs.python.org/3/library/os.path.html

Однако комментарий abarnert верен. Такое поведение вызвано тем, как Windows интерпретирует пути.

person Anonymous    schedule 19.07.2018
comment
Круто - ссылка на документацию отличная. - person aggieNick02; 20.07.2018
comment
@aggieNick02 Отлично. Рад, что смог помочь. - person Anonymous; 20.07.2018

Это не функция Python, это общая функция Windows.

В Windows каждый диск отслеживает свой текущий рабочий каталог. Так что на самом деле «текущий рабочий каталог» — это текущий рабочий каталог текущего диска.

  • chdir('F:') изменяет диск на F, но не меняет рабочий каталог F, поэтому в конечном итоге вы переходите в текущий каталог диска F.

  • chdir('F:\\') изменяет диск на F и изменяет рабочий каталог F на его корень, так что в конечном итоге вы переходите в корневой каталог диска F.

Это также не относится к chdir. Любая функция, работающая с путями, даже open, будет действовать таким образом.

*open('F:spam.txt') открывает файл spam.txt в текущем рабочем каталоге диска F (даже если ваш текущий диск, скажем, C). (Это согласуется с тем, как работают инструменты в стиле DOS.)

*open('F:\\spam.txt') открывает файл spam.txt в корневом каталоге диска F.


Некоторые кросс-платформенные инструменты вместо этого пытаются притвориться, что диски являются точками монтирования верхнего уровня, поэтому cd F: похоже на cd /f/ и действительно ведет к корню F. Преимущество этого заключается в том, что родные сборки Windows и Cygwin вашей программы работают очень похоже, но недостатком является то, что ваша программа не работает как традиционные программы в стиле DOS. В общем, больше инструментов делают то же самое, что и Python — это дает вам больше гибкости и, как правило, менее запутанно.


Как вы добавили в комментарии:

Помимо «Могу ли я полагаться на то, что это не изменится», я имею в виду, кто может сказать, что Microsoft сломает в своей недавно анонсированной «улучшенной» консоли.

Что ж, такое поведение восходит к… я думаю, PC-DOS 2.0 или когда они впервые добавляли каталоги. И если бы они когда-либо собирались улучшить это, они, по-видимому, сделали бы это, избавившись от диска и пути для чего-то более гибкого или более похожего на POSIX. (Хотя пути UNC и \\.\… «необработанные» пути уже, возможно, являются более гибкими и более похожими на POSIX, и они не избавились от системы дисков и каталогов, когда добавили их в NT…)

person abarnert    schedule 19.07.2018
comment
CD f: комментарий на месте. Мне не пришло в голову попробовать в командной строке cd f: убедиться, что это не меняет cwd. Я рад, что os.chdir ведет себя иначе, чем cd, в случае, если аргумент не для текущего диска, потому что это было бы невероятно неприятно... - person aggieNick02; 20.07.2018