使用python在windows上运行os.path.islink
在使用Python 2.7的Windows 7上,如何检测路径是否为符号链接?使用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在此之前没有处
这不起作用
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文件