在没有Pywin32的Python中检测Vista / 7上的符号链接(mklink)

时间:2009-09-20 22:06:20

标签: python windows windows-vista pywin32

目前,buildout recipe collective.recipe.omelette在所有版本的Windows上使用junction.exe来创建符号链接。但是,默认情况下,junction.exe不附带Windows,最重要的是不支持为文件(仅限目录)创建符号链接,导致相当多的Python包出现问题。

在NT6 +(Vista和7)上,现在有一个mklink实用程序,它不仅默认出现,而且还能够为文件和目录创建符号链接。我想更新collective.recipe.omelette以使用它(如果可用)并且已经这样做了,除了一个简单的功能;检测文件或文件夹是否实际上是符号链接。由于这是一个很小的构建配方,在我看来需要Pywin32有点太多了(除非setuptools不能以某种方式只在Windows上下载它?)。

目前在Windows上,煎蛋的功能是调用文件夹上的junction.exe,然后grep响应“替换名称:”但我找不到任何简单的mklink。

我能想到的唯一方法是在目录中调用“dir”,然后逐行查看响应“< SYMLINK>”和同一行上的文件夹/文件名。当然有更好的东西?

5 个答案:

答案 0 :(得分:5)

有关没有pywin32的Windows中符号链接操作的大量示例,请参阅jaraco.windows.filesystemjaraco.windows package的一部分)。

答案 1 :(得分:3)

您可以使用ctypes访问各种所需的功能和结构吗?目前正在讨论的this patch旨在为Vista和Windows 7下的模块os添加符号链接功能 - 但它不会出现在Python 2.7和3.2之前,所以等待(和要求)对于他们最终来的最新版本)可能会太长;一个基于ctypes的解决方案可能会让你度过难关,补丁中的代码显示了C中的代码(基于ctypes的Python编程只比C中的编程要困难一些)。 / p>

除非有人已经为此目的发布了其他一些独立的实用程序,例如junction.exe,否则除了使用ctypes,Pywin32之外,我看不到其他可行的方法(直到该补丁最终成为未来的Python的stdlib)或dir,你已经排除了这三个选项的最后两个......! - )

答案 2 :(得分:2)

在Windows联结和符号链接上具有重新分析点的属性FILE_ATTRIBUTE_REPARSE_POINT(0x400)。如果你得到文件的属性,那么检测它?

您可以使用ctypes(如其他答案中所述)访问Kernel32.dll and GetFileAttributes,并检测此值。

答案 3 :(得分:0)

你可以利用你在Tkinter上可用的Tcl,因为它有一个'文件链接'命令,可以知道连接,与Pythons os模块不同。

答案 4 :(得分:0)

我已经在广泛地寻找更好的解决方案,但是python 2.7对此没有一个好的解决方案。因此,最终,我得到了这个(下面的代码),它确实很丑陋,但是与我见过的所有ctype hacks相比,它是非常漂亮的。

import os, subprocess

def realpath(path):
    # not a folder path, ignore
    if (not os.path.isdir(path)):
        return path

    rootpath = os.path.abspath(path)
    oneup, foldername = os.path.split(rootpath)
    output = subprocess.check_output("dir " + oneup, shell=True)

    links = {}
    for line in output.splitlines():
        pos = line.find("<SYMLINKD>")
        if not pos == -1:
            link = line[pos+15:].split()
            links[link[0]] = link[1].strip("[]")
    return links[foldername] if links.has_key(foldername) else rootpath