【发布时间】:2017-06-05 21:02:35
【问题描述】:
自 Windows 10 创建者更新以来,您可以启用开发者模式以在创建符号链接时绕过管理员权限。现在,我可以像这样使用 mklink 创建符号链接:
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,所以我不知道这是否可行,但这似乎是一个相当烦人的跳跃即使确实如此...我感谢您提供的任何帮助
【问题讨论】:
-
os.symlink还不支持SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE。但无论如何,此功能在 Python 2 中的 Windows 上不可用。如果您有 PyWin32 可用,您可以调用win32file.CreateSymbolicLink并手动传入标志值 (2)。请记住指出目标何时是目录 (1),在这种情况下,Flags需要这两个值,例如2 | 1. -
此时我无权访问 pywin32...我尝试在此
kdll = ctypes.windll.LoadLibrary("kernel32.dll"); kdll.CreateSymbolicLinkW(dst, src, 2)中使用该标志未成功 抱歉格式错误...无法弄清楚如何删除这些两行下来,所以他们每个人都有自己的行 -
使用
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)。然后,如果调用失败,您可以通过raise ctypes.WinError(ctypes.get_last_error())引发准确的异常。