用python在windows上运行os.path.islink

use*_*986 11 python windows symlink pywin32

在带有Python 2.7的Windows 7上,如何检测路径是否为符号链接?这不起作用os.path.islink(),它说如果错误或不支持它返回false,我提供的路径肯定是一个符号链接所以我假设它不支持在Windows上?我能做什么?

aba*_*ert 20

根本问题是你使用的版本太旧了.如果你想坚持2.x,你将无法利用2010年初之后添加的新功能.

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

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

代码未被移植回2.x的原因是,永远不会有2.8,而像2.7.3(或2.7.4)这样的错误修复版本不会获得新功能,只会修复错误.

这已被报告为问题13143,并且预期的修复是更改2.7文档以阐明islink始终False在Windows上返回.

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

或者,正如Martijn Pieters建议的那样,不要自己动手,而是使用类似的第三方库jaraco.windows和/或借用他们的代码.

或者,如果您真的想要,请从3.2源代码中借用代码并围绕它构建一个C扩展模块.如果从跟踪下来ntpathosnt(实际上是posixmodule.c),我相信它的胆量都在win32_xstat_implwin32_xstat_impl_w.


Sea*_*ren 5

这是我最终用来确定文件或目录是否是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
Run Code Online (Sandbox Code Playgroud)

编辑:根据Zitrax和Annan的建议修改代码


Zit*_*rax 5

对于目录:

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):
Run Code Online (Sandbox Code Playgroud)

资源