在Vista/7上使用Python检测符号链接(mklink),无需Pywin32

5 投票
5 回答
1776 浏览
提问于 2025-04-15 14:28

目前,buildout的一个工具叫做collective.recipe.omelette,在所有版本的Windows上使用junction.exe来创建符号链接。不过,junction.exe并不是Windows自带的工具,而且最重要的是,它只能创建指向文件夹的符号链接,不能指向文件,这就导致了一些Python包出现问题。

在NT6及以上版本(比如Vista和7)中,Windows自带了一个叫做mklink的工具,它不仅可以创建指向文件的符号链接,还可以创建指向文件夹的符号链接。我想更新collective.recipe.omelette,让它在有mklink的情况下使用这个工具,我已经做了这个更新,除了一个比较简单的功能:检测一个文件或文件夹是否真的是符号链接。因为这个buildout工具比较小,我觉得要求安装Pywin32有点过于复杂了(除非setuptools能在Windows上只下载它?)。

目前在Windows上,omelette的做法是调用junction.exe来处理文件夹,然后从返回的结果中查找“Substitute Name:”,但我找不到类似简单的方法来处理mklink。

我能想到的唯一方法是调用“dir”命令,然后逐行检查返回的结果,寻找“”和同一行中的文件夹或文件名。难道没有更好的方法吗?

5 个回答

2

在Windows系统中,连接点和符号链接有一个叫做 FILE_ATTRIBUTE_REPARSE_POINT(0x400)的属性,用来标识重解析点。如果你想查看一个文件的属性,怎么才能发现这个呢?

你可以使用ctypes(就像其他回答中提到的那样)来访问 Kernel32.dll 和 GetFileAttributes,然后检测这个属性值。

5

可以查看 jaraco.windows.filesystem 这个链接,它是 jaraco.windows 包 的一部分,里面有很多关于在Windows系统中如何使用符号链接的详细例子,而不需要用到pywin32。

3

你能不能用 ctypes 来访问一些需要的功能和结构呢?目前正在讨论的 这个补丁,是为了在Vista和Windows 7的 os模块中添加符号链接功能——不过它不会在Python 2.7和3.2之前推出,所以等到它们发布的时候,可能会等得太久;用 ctypes 的解决方案可能会帮你暂时解决问题,而补丁中的代码展示了用C语言实现这个功能需要什么(用Python编写的基于ctypes的程序只比用C编写的稍微难一点)。

除非有人已经发布了像 junction.exe 这样的独立工具,否则我觉得在这个补丁最终加入未来的Python标准库之前,没有其他可行的方法,除了使用ctypes、Pywin32或 dir,而你已经排除了这三种选择中的最后两种...!-)

撰写回答