【问题标题】:How to create symlinks in windows using Python?如何使用 Python 在 Windows 中创建符号链接?
【发布时间】:2015-01-03 10:55:55
【问题描述】:

我正在尝试在 Windows 8 上使用 Python 创建symlinks。我找到了This Post,这是我脚本的一部分。

import os

link_dst = unicode(os.path.join(style_path, album_path))
link_src = unicode(album_path)
kdll = ctypes.windll.LoadLibrary("kernel32.dll")
kdll.CreateSymbolicLinkW(link_dst, link_src, 1)

首先,它只有通过管理员cmd执行才能创建符号链接。为什么会这样?

其次,当我尝试从 Windows 资源管理器中打开这些符号链接时,我收到此错误:

...Directory is not accessible. The Name Of The File Cannot Be Resolved By The System.

有没有更好的使用 Python 创建符号链接的方法?如果没有,我该如何解决?

编辑

这是专辑链接器中的for 循环:

def album_Linker(album_path, album_Genre, album_Style):
genre_basedir = "E:\Music\#02.Genre"
artist_basedir = "E:\Music\#03.Artist"
release_data_basedir = "E:\Music\#04.ReleaseDate"
for genre in os.listdir(genre_basedir):
    genre_path = os.path.join(genre_basedir, "_" + album_Genre)
    if not os.path.isdir(genre_path):
        os.mkdir(genre_path)
    album_Style_list = album_Style.split(', ')
    print album_Style_list
    for style in album_Style_list:
        style_path = os.path.join(genre_path, "_" + style)
        if not os.path.isdir(style_path):
            os.mkdir(style_path)
        album_path_list = album_path.split("_")
        print album_path_list
        #link_dst = unicode(os.path.join(style_path, album_path_list[2] + "_" + album_path_list[1] + "_" + album_path_list[0]))
        link_dst = unicode(os.path.join(style_path, album_path))
        link_src = unicode(album_path)
        kdll = ctypes.windll.LoadLibrary("kernel32.dll")
        kdll.CreateSymbolicLinkW(link_dst, link_src, 1)

它需要 album_Genrealbum_Style 然后它在 E:\Music\#02.Genre 下创建目录。它还从脚本的主体中获取专辑路径。这个 album_path 是我要在 E:\Music\#02.Genre\Genre\Style 下创建符号链接的目录路径。所以album_path是从脚本主体中的另一个for循环中获取的变量

for label in os.listdir(basedir):
label_path = os.path.join(basedir, label)
for album in os.listdir(label_path):
    album_path = os.path.join(label_path, album)
    if not os.path.isdir(album_path):
        # Not A Directory
        continue
    else:
        # Is A Directory
        os.mkdir(os.path.join(album_path + ".copy"))
        # Let Us Count
        j = 1
        z = 0
        # Change Directory
        os.chdir(album_path)

【问题讨论】:

  • 这个answer 可能会有所帮助
  • 你的路径是什么? link_dst, link_src
  • @Andy 我试过了,我从导入中得到了未定义的变量:CreateSymbolicLinkW
  • @User 此代码存在于for 循环中。所以路径正在改变。例如 link_dst = "E:\Music\#02.Genre_Electronic_Bass Music\1-800Dinosaur-1-800-001_[JamesBlake-Voyeur(Dub)AndHolyGhost]_2013-05-00" and link_dst = "E:\Music\ #01.Label_1-800Dinosaur\1-800Dinosaur-1-800-001_[JamesBlake-Voyeur(Dub)AndHolyGhost]_2013-05-00"
  • 如果你可以使用 Python 3,那就是 os.symlink

标签: python operating-system directory ctypes symlink


【解决方案1】:

首先,只有通过管理员cmd执行才能创建符号链接。

用户需要“创建符号链接”权限才能创建符号链接。默认情况下,普通用户没有,但管理员有。改变它的一种方法是使用安全策略编辑器。以管理员身份打开命令提示符,运行secpol.msc,然后转到Security Settings\Local Policies\User Rights Assignment\Create symbolic links 进行更改。

其次,当我尝试从 Windows 资源管理器中打开这些符号链接时,我收到此错误:

您没有转义文件名中的反斜杠。只需在原始字符串的前面添加“r”,文件名就会更改。您正在设置一个不存在的文件名,因此资源管理器无法找到它。

>>> link_dst1 = "E:\Music\#02.Genre_Electronic_Bass Music\1-800Dinosaur-1-800-001_[JamesBlake-Voyeur(Dub)AndHolyGhost]_2013-05-00"
>>> link_dst2 = r"E:\Music\#02.Genre_Electronic_Bass Music\1-800Dinosaur-1-800-001_[JamesBlake-Voyeur(Dub)AndHolyGhost]_2013-05-00"
>>> link_dst1 == link_dst2
False
>>> print link_dst1
E:\Music\#02.Genre_Electronic_Bass Music☺-800Dinosaur-1-800-001_[JamesBlake-Voyeur(Dub)AndHolyGhost]_2013-05-00

【讨论】:

  • 好的,我更改了策略,以便我作为普通用户可以创建符号链接,但它似乎不起作用。
  • 在命令行上是什么样子的?在带有链接的目录中创建一个目录,它看起来像11/06/2014 01:28 PM <SYMLINKD> link_dir [target_dir],你可以 cd 进入它吗?
  • 不,File Not Found。这是因为“r”在我的脚本中的路径之前不存在吗?
  • 没有必要。这取决于字符串的来源。如果它在您的程序中是一个字符串(在尝试调试时很常见),您需要“r”或将反斜杠写为 \\.如果你从 os.listdir 得到它,你就没事。如何像我上面那样发布 dir 命令的结果。它可能会提供线索。
【解决方案2】:

os.symlink 开箱即用,因为 Windows 上的 python 3.8,只要打开Developer Mode

【讨论】:

    猜你喜欢
    • 2010-09-16
    • 2019-12-07
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    相关资源
    最近更新 更多