This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author eryksun
Recipients Hong Xu, eryksun, paul.moore, serhiy.storchaka, steve.dower, tim.golden, zach.ware
Date 2021-01-09.13:06:23
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1610197583.63.0.493292568979.issue42872@roundup.psfhosted.org>
In-reply-to
Content
NT filesystems are specified to fail with STATUS_OBJECT_PATH_NOT_FOUND (0xC000003A) if a parent component in a path either does not exist or is not a directory. In the Windows API, this translates to ERROR_PATH_NOT_FOUND (3), which in the C runtime translates to ENOENT (2), which in Python is raised as FileNotFoundError.

The design of Path.mkdir() assumes POSIX behavior, which splits the above two cases respectively into ENOENT and ENOTDIR. Thus it assumes that FileNotFoundError means a parent component does not exist. This eliminates the race condition of having to test whether the parent path exists. In Windows, it's not possible to differentiate the two cases by error code alone, so unfortunately Path.mkdir() tries to create the parent path when it contains a non-directory component, and thus a nested FileExistsError exception is raised.

The design of os.makedirs() instead checks whether the parent exists before trying to create it, and ignores FileExitsError if creating the parent tree fails due to a race condition. This design behaves a bit more consistently across platforms, but it still fails with a different exception on Windows vs POSIX, i.e. FileNotFoundError vs NotADirectoryError.
History
Date User Action Args
2021-01-09 13:06:23eryksunsetrecipients: + eryksun, paul.moore, tim.golden, zach.ware, serhiy.storchaka, steve.dower, Hong Xu
2021-01-09 13:06:23eryksunsetmessageid: <1610197583.63.0.493292568979.issue42872@roundup.psfhosted.org>
2021-01-09 13:06:23eryksunlinkissue42872 messages
2021-01-09 13:06:23eryksuncreate