2017-06-05 82 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'確實抑制了彈出的控制檯窗口。 –

相關問題