2017-06-05 1 views
2

Depuis la mise à jour du créateur Windows 10, vous pouvez activer le mode développeur pour contourner les privilèges d'administrateur lors de la création d'un lien symbolique. Maintenant, je suis en mesure de créer un lien symbolique en utilisant mklink comme ceci:Python symlink dans Windows 10 creators mise à jour

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

Espérons qu'il est évident que dst est le chemin symlink de destination et src est le fichier source du lien symbolique. Bien que cela semble fonctionner, il n'y a pas d'erreur en cas d'échec, ce qui rend un peu plus difficile la réussite de chaque lien symbolique. Je peux vérifier si le chemin existe après chaque lien symbolique, mais c'est moins efficace qu'une clause try/except. Il y a aussi ce qui ressemble à une fenêtre de shell de commande (?) Qui apparaît et se ferme rapidement à chaque fois - et c'est vraiment énervant quand vous créez beaucoup de fichiers ...

Donc, j'ai essayé d'autres options J'ai trouvé sur débordement de pile comme celui-ci: How to create symlinks in windows using Python? Malheureusement, la commande CreateSymbolicLinkW ne semble pas fonctionner pour moi ... J'ai également trouvé ceci: OS.symlink support in windows où il apparaît que vous devez ajuster l'éditeur de stratégie de groupe; Toutefois, il semble que les utilisateurs du groupe d'administrateurs doivent toujours exécuter le processus en tant qu'administrateur, même si vous définissez explicitement cet utilisateur avec des privilèges de lien symbolique.

vous pouvez voir la référence pour ce ici avec les fenêtres 10 mise à jour du créateur, il y a mention d'une nouvelle dwFlag dans le CreateSymbolicLink api (SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE): symlinks windows 10

À l'aide des choses ctypes est un Je me demande si quelqu'un sait: Est-ce que je peux vraiment utiliser ce nouveau dwflag? Comment l'utiliser? Cela fonctionnera-t-il sans exécuter le processus en tant qu'administrateur? J'utilise Autodesk Maya, donc je suis bloqué avec les options de python 2.7 ... Je n'ai pas essayé de lancer Maya en tant qu'administrateur, donc je ne sais pas si ça marchera, mais ça me semble plutôt ennuyeux sauter à travers même si elle ... Je vous remercie de toute aide que vous pouvez donner

+0

'os.symlink' ne prend pas encore en charge' SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE'. Mais cette fonction n'est pas disponible sur Windows dans Python 2 de toute façon. Si vous avez PyWin32 disponible, vous pouvez appeler ['win32file.CreateSymbolicLink'] (http://docs.activestate.com/activepython/2.6/pywin32/win32file__CreateSymbolicLink_meth.html) et passer manuellement la valeur de l'indicateur (2). N'oubliez pas d'indiquer quand la cible est un répertoire (1), auquel cas 'Flags' a besoin des deux valeurs, par ex. '2 | 1'. – eryksun

+0

Je n'ai pas accès à pywin32 à ce stade ...J'ai essayé sans succès d'utiliser le drapeau dans ce 'kdll = ctypes.windll.LoadLibrary (" kernel32.dll "); kdll.CreateSymbolicLinkW (dst, src, 2) 'Désolé pour le mauvais formatage ... impossible de trouver comment lâcher ces deux lignes pour qu'elles aient chacune leur propre ligne –

+0

Utilisez' kernel32 = ctypes.WinDLL ('kernel32', use_last_error = True) '. Ensuite, si un appel échoue, vous pouvez déclencher une exception précise via 'raise ctypes.WinError (ctypes.get_last_error())'. – eryksun

Répondre

2

it doesn't error if it fails

os.system renverra l'état de sortie de l'appel. Il ne soulève pas d'exception.

Si vous consultez les docs pour os.system, ils recommandent d'utiliser le module de sous-processus. En fait, subprocess.check_call fait ce que vous décrivez (lever une exception sur un statut de sortie différent de zéro). Peut-être que cela fonctionnerait mieux. D'autre part, la commande mklink retournera un statut de sortie zéro même si la source n'existe pas (cela créera un lien vers un fichier inexistant et retournera 0). Vous pouvez vouloir valider le lien réel comme vous l'avez mentionné, en fonction des erreurs que vous essayez de trouver. Pour masquer la fenêtre de la console, voir this.

+1

Avec le sous-processus, vous aurez besoin de 'shell = True' pour lancer' mklink' puisqu'il s'agit d'une commande shell interne. 'shell = True' masque automatiquement la fenêtre de la console. – eryksun

+0

J'avais besoin non seulement de 'shell = True', mais aussi d'une invite de commande élevée, pour python ou shell, sinon j'ai' FileNotFoundError: [WinError 2] Le système ne trouve pas le fichier spécifié' de python et 'You n'ont pas les privilèges suffisants pour effectuer cette opération. »depuis le shell. – Wyrmwood

+0

'subprocess.check_call ('mklink% s% s'% (dst, src), shell = True)' a bien fonctionné! Heureusement, avec le mode développeur activé, je n'ai pas eu une erreur de privilèges comme Wyrmwood. Et 'shell = True' a supprimé la fenêtre de la console. –