os.path.islink与蟒蛇窗口(os.path.islink on windows with

2019-07-21 02:37发布

在Windows 7与Python 2.7我怎么能检测一个路径是一个符号链接? 这不起作用os.path.islink()它说,它返回false虚假或不支持,我提供的路径,绝对是一个符号链接,所以我猜想它不支持Windows? 我能做什么?

Answer 1:

问题的根源是,你正在使用太旧版本的Python。 如果你想坚持到2.x中,你将不能够采取的2010年初之后添加新功能。

这些功能之一是处理NTFS符号链接。 在3.2中加入该功能在2010年底(见3.2 , 3.1 ,以及2.7源的信息。)

Python的原因没有处理NTFS符号链接在此之前是没有这样的事,直到2009年年底(IIRC,支持被列入6.0内核中,但用户空间支持需要/ 2008在Vista服务包;只有7 / 2008R2和新来与它内置的。另外,你需要一个新的,足以MSVCRT能够访问用户空间支持,Python有没有升级到次要版本中新的Visual Studio版本的明确政策。)

代码并不移植回2.X的原因是那永远不会有一个2.8和bug修复版本2.7.3一样(或2.7.4)没有得到新的功能,只有错误修复。

这已被报告为问题13143 ,和预期的修复方法是将2.7文档澄清islink总是返回False的Windows。

所以,如果你想阅读Windows下NTFS符号链接,要么升级到Python 3.2+,或者你必须使用win32apictypes ,等自己做。

或者,正如马亭Pieters的建议,而不是自己动手,使用第三方库像jaraco.windows ,做它和/或借用他们的代码 。

或者,如果你真的想,借由3.2源代码,并围绕它建立一个C扩展模块。 如果从跟踪下来ntpathosnt (实际上是posixmodule.c ),我相信它的胆量是win32_xstat_implwin32_xstat_impl_w



Answer 2:

这是我结束了使用,以确定是否一个文件或目录是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和安南的建议



Answer 3:

对于目录:

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):

资源



Answer 4:

刚开始使用if file[-4:len(file)] != ".lnk":对我的作品



Answer 5:

您也可以使用pywin32模块: GetFileAttributes是可用win32api子模块和FILE_ATTRIBUTE_REPARSE_POINTwin32con模块。 例如,为了测试给出的路径是一个符号链接到一个目录,代码变为:

import os
import win32api
import win32con

def is_directory_symlink(path):
    return bool(os.path.isdir(path) 
                and (win32api.GetFileAttributes(path) &
                     win32con.FILE_ATTRIBUTE_REPARSE_POINT))

如果使用Python 2和路径可以包含非ASCII字符, GetFileAttributes需要Unicode字符串。 然而,简单地使用unicode(path)通常会失败:你应该测试,如果path是一个str ,如果是这样,使用它的decode方法。



文章来源: os.path.islink on windows with python