2017-06-05 49 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あなたはグループポリシーエディタを調整する必要があるようです。ただし、明示的にsymlink特権でそのユーザーを設定したとしても、管理者グループのユーザーは管理者としてプロセスを実行する必要があります。窓10クリエータアップデートで

は、新しいdwflagの言及はCreateSymbolicLink API(SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE)にあります、あなたはここでそのためのリファレンスを参照してくださいすることができますsymlinks windows 10

をctypesのものを使用すると、aは私の頭の上のビット、誰かが知っている場合私は思っている:私は実際に新しい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)であることを示すことを忘れないでください。この場合、 'Flags'は両方の値を必要とします。 '2 | 1 'となる。 – eryksun

+0

この時点で私はpywin32にアクセスできません...私はこの 'kdll = ctypes.windll.LoadLibrary(" kernel32.dll ")でフラグを使用しようとして失敗しました。 kdll.CreateSymbolicLinkW(dst、src、2) '不正な書式設定は残念です...これらの2行を落として、それぞれが独自の行を持つようにする方法を見つけられませんでした –

+0

' kernel32 = ctypes.WinDLL( 'kernel32' use_last_error = True) 'を返します。その後、呼び出しが失敗した場合は、 'raise ctypes.WinError(ctypes.get_last_error())'によって正確な例外を送出することができます。 – eryksun

答えて

2

it doesn't error if it fails

os.systemはコールの終了ステータスを返します。例外は発生しません。

os.systemのドキュメントを見る場合は、サブプロセスモジュールを使用することをお勧めします。実際には、subprocess.check_callはあなたのことを行います(ゼロ以外の終了ステータスで例外を発生させます)。おそらくそれはうまくいくでしょう。

一方、mklinkコマンドは、ソースが存在しない場合でも、ゼロ終了ステータスを返します(存在しないファイルへのリンクを作成し、0を返します)。見つけようとしているエラーに応じて、言及したように実際のリンクを検証することができます。

コンソールウィンドウを隠す限り、thisを参照してください。

+1

サブプロセスでは、内部シェルコマンドであるため、 'mklink'を実行するには' shell = True'が必要です。 'shell = True'は自動的にコンソールウィンドウを隠します。 – eryksun

+0

私は 'shell = True'だけでなく、pythonやシェルのために昇格されたコマンドプロンプトを開く必要がありました。そうでなければ、Pythonから' FileNotFoundError:[WinError 2]シェルからこの操作を実行するのに十分な特権がありません。 – Wyrmwood

+0

'subprocess.check_call( 'mklink%s%s'%(dst、src)、shell = True)'うまくいった!幸運にも、開発者モードが有効になっていると、私はWyrmwoodのような特権エラーを取得しませんでした。そして 'shell = True'は、コンソールウィンドウがポップアップするのを抑制しました。 –

関連する問題