Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python在windows上运行os.path.islink_Python_Windows_Symlink_Pywin32 - Fatal编程技术网

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

使用python在windows上运行os.path.islink,python,windows,symlink,pywin32,Python,Windows,Symlink,Pywin32,在使用Python 2.7的Windows 7上,如何检测路径是否为符号链接? 这不起作用os.path.islink(),它说如果为false或不受支持,它将返回false,并且我提供的路径肯定是一个符号链接,所以我假设它在windows上不受支持?我能做什么?根本问题是您使用的Python版本太旧。如果您想坚持使用2.x,您将无法利用2010年初之后添加的新功能 其中一个功能是处理NTFS符号链接。该功能于2010年末在3.2中添加。(有关详细信息,请参阅和源。) Python在此之前没有处

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

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

其中一个功能是处理NTFS符号链接。该功能于2010年末在3.2中添加。(有关详细信息,请参阅和源。)

Python在此之前没有处理NTFS符号链接的原因是直到2009年底才出现这种情况。(IIRC,支持包含在6.0内核中,但userland支持需要Vista/2008上的service pack;只有7/2008R2和更新版本内置。此外,您需要足够新的MSVCRT才能访问该userland支持,Python有一个明确的策略,即不在小版本内升级到新的Visual Studio版本。)

代码没有移植回2.x的原因是,像2.7.3(或2.7.4)这样的bug修复版本没有新功能,只有bug修复

这已被报告为,计划的修复程序是更改2.7文档,以澄清
islink
在Windows上始终返回
False

因此,如果你想在Windows下读取NTFS符号链接,要么升级到Python 3.2+,要么你必须自己使用等等

或者,正如Martijn Pieters所建议的那样,与其自己动手,不如使用第三方库来完成和/或借阅


或者,如果您真的愿意,可以借用3.2源代码并围绕它构建一个C扩展模块。如果从
ntpath
os
再到
nt
(实际上是
posixmodule.c
),我相信它的精髓就在这里。

这就是我用来确定文件或目录是否是Windows 7中的链接的方法:

from subprocess import check_output, CalledProcessError
import os.path
import ctypes
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
来自子流程导入检查\u输出,称为流程错误
导入操作系统路径
导入ctypes
def isLink(路径):
如果os.path.存在(路径):
如果os.path.isdir(路径):
文件\属性\重新分析\点=0x0400
attributes=ctypes.windl.kernel32.GetFileAttributesW(unicode(路径))
返回(属性和文件属性重新分析点)>0
其他:
命令=['dir',path]
尝试:
打开(os.devnull,'w')作为空\u文件:
o0=检查输出(命令,stderr=NULL\u文件,shell=True)
除被调用的进程错误为e外:
打印输出
返回错误
o1=[s.strip()用于o0.split('\n')中的s]
如果len(o1)<6:
返回错误
其他:
在o1[5]中返回“符号链接”
其他:
返回错误
编辑:根据Zitrax和Annan的建议修改代码

编辑:根据shioko的建议为目录添加了include语句:

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

只需使用
if文件[-4:len(文件)]!=“.lnk”:
适用于我

您也可以使用pywin32模块:
GetFileAttributes
可在
win32api
子模块中使用,也可在
win32con
模块中使用。例如,要测试给定路径是否是指向目录的符号链接,代码为:

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
方法。

可能会提供一些帮助;它必须使用
ctypes
来支持这一点。Python 3.2确实正确地支持Windows符号链接。您一定是被误导了。使用NTFS 3.0的windows NT 5(windows 2000)确实存在重新分析点。它是功能性的。python实现只是懒惰或信息错误。在Python3.6中不适用于目录连接:
os.path.islink('c:\\users\\erik\\Local Settings')
当文件不存在时,从
检查输出
捕获
CalledProcessError
s是值得的。您还可以传递
stderr=subprocess.PIPE
以隐藏到stdin的错误输出。这个解决方案确实很粗糙,但比另一个答案更可行。这个答案不适用于检查目录是否是链接,因为dir命令只列出内容。从哪里导入
unicode
函数?你应该包括所有的进口声明。谢谢@shioko。不完整的代码非常令人恼火。已更正疏忽。源已失效。与源相比,您缺少return语句。您可以检查结果是否>0,否则结果为1024这是被否决的,因为用户询问的是重分析点,而不是.lnk文件