我在os.walk()
上运行"C:\Users\confusedDev\Documents"
,我看到["My Music", "My Pictures"...]
作为subDirs返回,但他们实际上并没有被访问。经过一些研究后,我发现它们实际上是Windows中的junctions。
我的理解是,结点是指向目录的符号链接,在os.walk()
期间默认会被忽略,但是以下测试使我失败了
>>> os.path.islink("C:\\Users\\confusedDev\\Documents\\My Pictures")
False
嗯...... os.walk()
怎么知道“C:\ Users \ confusedDev \ Documents \ My Pictures”是“C:\ Users \ confusedDev \ Pictures”的符号链接,需要跳过吗?我想调用相同的api ...现在,我的解决方法逻辑假设如果os.walk()
跳过一个目录,它就是一个结点
使用python3.5
,islink
为junction links
返回false。似乎python3.5
本身不支持联结链接,但可以使用ctypes
或外部库添加对联结链接的支持:
这些是更复杂的解决方案。此外,如果您使用junction links
,它们将无法在以前版本的Windows或其他操作系统上运行。
TL; DR为了使它可移植,最好使用junction links
而不是symbolic links
将mklink /D
转换为mklink /J
。 symbolic links
被os.walk
和os.path.islink
认可。
我将要使用的另一种方法是子进程。只需调用外部Windows程序,该程序提供有关Windows中链接的信息,如果链接存在则返回0作为返回代码,如果不存在或不是链接则返回其他:
fsutil reparsepoint query "<PathToTest>"
像这样的东西例如:
src = "C:\\Windows"
child = subprocess.Popen(
"fsutil reparsepoint query \"{}\"".format(src),
stdout=subprocess.PIPE
)
streamdata = child.communicate()[0]
rc = child.returncode
if rc == 0:
print("Link exists")
在Windows 10上,作为普通用户(也可以创建链接)工作正常,但对于Windows 7,您需要管理员权限。对我来说不是问题,因为我的应用程序将检查链接以创建一个新的,所以它无论如何都需要Windows 7上的管理员权限。
问候!