4

目前,构建配方collective.recipe.omelette 在所有Windows 版本上使用junction.exe 来创建符号链接。但是 junction.exe 默认情况下不随 Windows 提供,最重要的是不支持创建指向文件(仅目录)的符号链接,这会导致很多 Python 包出现问题。

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

目前在 Windows 上,omelette 所做的是在文件夹上调用 junction.exe,然后 grep 响应“替代名称:”,但我找不到任何与 mklink 一样简单的东西。

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

4

5 回答 5

5

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

于 2009-10-23T22:13:35.730 回答
3

你能用它ctypes来访问各种需要的功能和结构吗? 目前正在讨论的这个补丁旨在为osVista 和 Windows 7 下的模块添加符号链接功能——但它不会在 Python 2.7 和 3.2 之前出现,所以等待(以及对最新版本的要求)最终来)可能太长了;基于ctypes- 的解决方案可能会让您渡过难关,补丁中的代码显示了在 C 中执行此操作所需的内容(并且在 Python 中基于 ctypes 编程仅比在 C 中相同的编程难一点)。

除非有人已经为此目的发布了其他一些独立实用程序junction.exe,否则除了使用 ctypes、Pywin32 或 之外,我看不到其他可行的方法(直到该补丁最终使其成为未来的 Python 标准库)dir,并且您已经裁定去掉这三个选项中的最后两个...!-)

于 2009-09-20T23:35:01.920 回答
2

在 Windows 连接点和符号链接上,具有FILE_ATTRIBUTE_REPARSE_POINT重新解析点的属性 (0x400)。如果你得到了文件的属性,那么就检测到这个?

您可以使用 ctypes (如另一个答案中所述)访问Kernel32.dll 和 GetFileAttributes,并检测此值。

于 2009-09-21T01:10:33.850 回答
0

您可以利用 Tkinter 提供的 Tcl,因为它有一个知道连接的“文件链接”命令,这与 Python 的 os 模块不同。

于 2011-01-06T00:03:08.100 回答
0

我已经广泛搜索了一个更好的解决方案,但是 python 2.7 并没有一个好的解决方案。所以最终,我得到了这个(下面的代码),它确实很丑,但与我见过的所有 ctypes hack 相比,它非常漂亮。

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
于 2018-10-05T19:09:43.213 回答