2017-06-05 71 views
2

自Windows 10创建者更新以来,您可以在创建符号链接时启用开发者模式以规避管理员权限。现在,我能够创建一个使用mklink这样的符号链接:Windows 10创作者更新中的python符号链接

os.system('mklink %s %s' %(dst, src)) 

希望很明显,DST是目标符号链接路径,SRC是符号链接的源文件。虽然它似乎可以正常工作,但如果它失败,则不会发生错误,这使得确保每个符号链接成功更困难。我可以在每个符号链接后检查路径是否存在,但这比try/except子句效率低。还有什么看起来像一个命令外壳窗口(?),每次都会弹出并快速关闭 - 而且当你符合很多文件时,这真的很烦人......

所以,我一直在尝试其他选项我发现堆栈溢出像这样:How to create symlinks in windows using Python?不幸的是,CreateSymbolicLinkW命令似乎不适合我...我也发现这个:OS.symlink support in windows它出现的地方你需要调整组策略编辑器;但是,显然仍然需要管理员组中的用户以管理员身份运行该进程,即使您使用符号链接权限明确设置了该用户。

与Windows 10的创造者更新,有一个在CreateSymbolicLink API(SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE)的新dwflag提及您可以看到,这里的参考:symlinks windows 10

使用ctypes的东西是一有点在我的头上,所以我想知道是否有人知道:我可以使用新的dwflag吗?我如何使用它?它是否会在没有以管理员身份运行进程时运行

我使用Autodesk Maya,所以我被困在python 2.7选项中......我没有尝试启动Maya作为管理员,所以我不知道这是否可行,但它看起来像一个相当恼人的箍跳过即使它...我感谢您可以给任何帮助

+0

'os.symlink'还不支持'SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE'。但是,Python 2中的这个函数在Windows上是不可用的。如果您有PyWin32可用,您可以调用['win32file.CreateSymbolicLink'](http://docs.activestate.com/activepython/2.6/pywin32/win32file__CreateSymbolicLink_meth.html)并手动传入标志值(2)。记住指出目标是何时是目录(1),在这种情况下,“标志”需要两个值,例如, '2 | 1'。 – eryksun

+0

我目前无法访问pywin32 ...我试图在这个'kdll = ctypes.windll.LoadLibrary(“kernel32.dll”)中使用标志失败; kdll.CreateSymbolicLinkW(dst,src,2)'抱歉格式不正确......无法弄清楚如何放下这两行以便它们各自拥有自己的行 –

+0

使用'kernel32 = ctypes.WinDLL('kernel32', use_last_error =真)'。然后,如果调用失败,可以通过'raise ctypes.WinError(ctypes.get_last_error())'来引发一个准确的异常。 – eryksun

回答

2

it doesn't error if it fails

os.system将返回呼叫的退出状态。它不会引发异常。

如果您查看os.system的文档,他们建议使用子流程模块。实际上,subprocess.check_call会执行您所描述的操作(在非零退出状态中引发异常)。也许这会更好。

另一方面,即使源不存在(它将创建到不存在的文件的链接并返回0),命令mklink将返回零退出状态。您可能想要验证您提到的实际链接,具体取决于您尝试查找的错误。

至于隐藏控制台窗口,请参阅this

+1

使用子进程,因为它是一个内部shell命令,所以需要'shell = True'来运行'mklink'。 'shell = True'会自动隐藏控制台窗口。 – eryksun

+0

我不仅需要'shell = True',还必须为python或shell打开提升的命令提示符,否则我得到了'FileNotFoundError:[WinError 2]系统无法从python找到指定的文件''You没有足够的权限来执行此操作。 – Wyrmwood

+0

'subprocess.check_call('mklink%s%s'%(dst,src),shell = True)'成功了!幸运的是,在启用开发者模式的情况下,我没有像Wyrmwood那样获得特权错误。而'shell = True'确实抑制了弹出的控制台窗口。 –