【问题标题】:python symlink in windows 10 creators updateWindows 10 创建者更新中的 python 符号链接
【发布时间】: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()) 引发准确的异常。

标签: python windows symlink


【解决方案1】:

如果失败也不会出错

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

如果您查看 os.system 的文档,他们建议使用 subprocess 模块。事实上,subprocess.check_call 做了您所描述的事情(在非零退出状态上引发异常)。也许这样会更好。

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

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

【讨论】:

  • 对于子进程,您需要shell=True 来运行mklink,因为它是一个内部shell 命令。 shell=True 自动隐藏控制台窗口。
  • 我不仅需要shell=True,还必须为python或shell打开提升的命令提示符,否则我从python得到FileNotFoundError: [WinError 2] The system cannot find the file specified,从shell得到You do not have sufficient privilege to perform this operation.。跨度>
  • subprocess.check_call('mklink %s %s' %(dst, src), shell=True) 效果很好!幸运的是,启用开发者模式后,我没有像 Wyrmwood 那样遇到权限错误。而shell=True 确实抑制了控制台窗口的弹出。
【解决方案2】:

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

不确定这是否对 Maya 有帮助;不过他们似乎有committed to Python 3

【讨论】:

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