在使用Python 2.7的Windows 7上,如何检测path是否是符号链接? 这不工作os.path.islink()
,它说,如果返回false或不支持和我提供的path肯定是一个符号链接,所以我假设它不支持在Windows上? 我能做什么?
根本的问题是你使用的Python版本太旧了。 如果你想坚持2.x,你将无法利用2010年初之后添加的新功能。
其中一个功能是处理NTFS符号链接。 该功能在2010年年底被添加到了3.2(详情请参阅3.2,3.1和2.7源代码)。
Python之前没有处理NTFS符号链接的原因是,直到2009年年底才有这种东西。(IIRC,支持包括在6.0内核中,但是用户级支持需要Vista / 2008上的Service Pack;只有7 / 2008R2和新的内置了它。另外,你需要一个足够新的MSVCRT来访问这个用户空间的支持,而且Python有一个明确的策略,就是在一个次要版本中不升级到新的Visual Studio版本。)
代码没有被移植回2.x的原因是永远不会有2.8 ,并且像2.7.3(或2.7.4)这样的错误修复版本不会获得新的功能,只有错误修复。
这已经被报告为问题13143 ,而打算修复的是修改2.7文档来澄清islink
在Windows上总是返回False
。
所以,如果你想在Windows下读取NTFS符号链接,可以升级到Python 3.2+,或者你必须使用win32api
, ctypes
等来自己完成。
或者,正如Martijn Pieters所建议的,不要自己动手,而应该使用像jaraco.windows
这样的第三方库,并且/或者借用他们的代码 。
或者,如果你真的想要,从3.2源码中借用代码并在其周围构建一个C扩展模块。 如果你从ntpath
到os
到nt
(实际上是posixmodule.c
),我相信它的win32_xstat_impl
在win32_xstat_impl
和win32_xstat_impl_w
。
对于目录:
import os, ctypes def IsSymlink(path): FILE_ATTRIBUTE_REPARSE_POINT = 0x0400 return os.path.isdir(path) and (ctypes.windll.kernel32.GetFileAttributesW(unicode(path)) & FILE_ATTRIBUTE_REPARSE_POINT):
资源
这是我最终用来确定文件或目录是否是Windows 7中的链接:
def isLink(path): if os.path.exists(path): if os.path.isdir(path): FILE_ATTRIBUTE_REPARSE_POINT = 0x0400 attributes = ctypes.windll.kernel32.GetFileAttributesW(unicode(path)) return (attributes & FILE_ATTRIBUTE_REPARSE_POINT) > 0 else: command = ['dir', path] try: with open(os.devnull, 'w') as NULL_FILE: o0 = check_output(command, stderr=NULL_FILE, shell=True) except CalledProcessError as e: print e.output return False o1 = [s.strip() for s in o0.split('\n')] if len(o1) < 6: return False else: return 'SYMLINK' in o1[5] else: return False
编辑:根据Zitrax和安南的建议修改代码