python 创建软连接_如何使用Python在Windows中创建符号链接?

I am trying to create symlinks using Python on Windows 8. I found This Post and this is part of my script.

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)

Firstly, It can create symlinks only when it is executed through administrator cmd. Why is that happening?

Secondly, When I am trying to open those symlinks from windows explorer I get This Error:

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

Is there a better way of creating symlinks using Python? If not, How can I solve this?

EDIT

This is the for loop in album_linker:

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)

It takes album_Genre and album_Style And then It creates directories under E:\Music\#02.Genre . It also takes album_path from the main body of the script. This album_path is the path of directory which i want to create the symlink under E:\Music\#02.Genre\Genre\Style . So album_path is a variable taken from another for loop in the main body of the script

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)

解决方案

Firstly, It can create symlinks only when it is executed through administrator cmd.

Users need "Create symbolic links" rights to create a symlink. By default, normal users don't have it but administrator does. One way to change that is with the security policy editor. Open a command prompt as administrator, run secpol.msc and then go to Security Settings\Local Policies\User Rights Assignment\Create symbolic links to make the change.

Secondly, When I am trying to open those symlinks from windows explorer I get This Error:

You aren't escaping the backslashes in the file name. Just by adding an "r" to the front for a raw string, the file name changes. You are setting a non-existant file name and so explorer can't find it.

>>> 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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值