Issue 33428: pathlib.Path.glob does not follow symlinks (original) (raw)
Given a pathlib.Path
that contains symlinked subfolders, Path.glob
(and .rglob
) do not follow symlinks. This is not consistent with glob.glob
which does.
For example given the following: C:\Folder C:\Folder\Subfolder -> D:\Subfolder D:\Subfolder\File.txt
pathlib.Path('C:/Folder').glob('**/*')
yields the following paths:
WindowsPath('C:/Folder/Subfolder')
glob.glob('C:/Folder/**/*')
yields the following paths:
'C:/Folder\Subfolder'
'C:/Folder\Subfolder\File.txt'
Notice how the contents of Subfolder are present in the glob.glob
results but not for Path.glob
.
I would expect Path.glob
to be consistent with glob.glob
. This is not the only inconsistency (e.g. #22276, #31202) and perhaps Path.glob
should be re-implemented using glob.glob
.
Windows does not implement symlinks as junctions. Windows has hardlinks, symlinks and junctions which are all distinctly different in behaviour.
I don't doubt that this is a Windows-specific issue, although I have not tested other platforms. Path.glob and .rglob does work for junctions and hardlinks but glob.glob works consistently for all three.
I can reproduce the bug with Linux and python 3.7.5:
Python 3.7.5 (default, Apr 19 2020, 20🔞17)
[GCC 9.2.1 20191008] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from pathlib import Path
>>> Path('a/b').mkdir(parents=True)
>>> Path('c/d').mkdir(parents=True)
>>> Path('a/c').symlink_to('../c')
>>> Path('e').symlink_to('c')
>>> list(Path('.').rglob('*'))
[PosixPath('e'), PosixPath('c'), PosixPath('a'), PosixPath('c/d'), PosixPath('a/c'), PosixPath('a/b')]
Expected result:
[PosixPath('e'), PosixPath('e/d'), PosixPath('c'), PosixPath('a'), PosixPath('c/d'), PosixPath('a/c'), PosixPath('a/c/d'), PosixPath('a/b')]