windows-vista python-2.7

windows vista - Soporte OS.symlink en windows



windows-vista python-2.7 (3)

Como la answer Gian Marco Gherardi, pero define os.symlink en Windows, para que su código pueda funcionar de manera segura en Windows y Linux:

import os os_symlink = getattr(os, "symlink", None) if callable(os_symlink): pass else: def symlink_ms(source, link_name): import ctypes csl = ctypes.windll.kernel32.CreateSymbolicLinkW csl.argtypes = (ctypes.c_wchar_p, ctypes.c_wchar_p, ctypes.c_uint32) csl.restype = ctypes.c_ubyte flags = 1 if os.path.isdir(source) else 0 if csl(link_name, source, flags) == 0: raise ctypes.WinError() os.symlink = symlink_ms

Si ejecuta su script como administrador, todo está bien, si desea ejecutarlo como usuario, debe otorgar a python un permiso para crear enlaces simbólicos , lo que solo es posible en Windows Vista + Ultimate o profesional.

Editar :

La answer Gian Marco Gherardi crea un enlace a una ruta de Unix: like/this y no funciona. La solución es hacer source.replace(''/'', ''//') :

# symlink support under windows: import os os_symlink = getattr(os, "symlink", None) if callable(os_symlink): pass else: def symlink_ms(source, link_name): import ctypes csl = ctypes.windll.kernel32.CreateSymbolicLinkW csl.argtypes = (ctypes.c_wchar_p, ctypes.c_wchar_p, ctypes.c_uint32) csl.restype = ctypes.c_ubyte flags = 1 if os.path.isdir(source) else 0 if csl(link_name, source.replace(''/'', ''//'), flags) == 0: raise ctypes.WinError() os.symlink = symlink_ms

Otra forma es usar la utilidad Vista + mklink . Pero el uso de esta utilidad requiere los mismos permisos. Todavía:

# symlink support under windows: import os os_symlink = getattr(os, "symlink", None) if callable(os_symlink): pass else: def symlink_ms(source, link_name): os.system("mklink {link} {target}".format( link = link_name, target = source.replace(''/'', ''//'))) os.symlink = symlink_ms

Edición 2 :

Esto es lo que finalmente estoy usando: esta secuencia de comandos crea un enlace en Windows si el usuario tiene privilegios para hacerlo, de lo contrario, simplemente no crea un enlace:

import os if os.name == "nt": def symlink_ms(source, link_name): import ctypes csl = ctypes.windll.kernel32.CreateSymbolicLinkW csl.argtypes = (ctypes.c_wchar_p, ctypes.c_wchar_p, ctypes.c_uint32) csl.restype = ctypes.c_ubyte flags = 1 if os.path.isdir(source) else 0 try: if csl(link_name, source.replace(''/'', ''//'), flags) == 0: raise ctypes.WinError() except: pass os.symlink = symlink_ms

Descargué python 2.7.1 del sitio web de python y lo instalé en Windows. Cuando intento vincular un archivo con un enlace simbólico, encuentro que no está soportado.

Sin embargo, encontré este problema y vi que estaba arreglado. ¿Será esto implementado, y si es así, cuándo? Estoy ejecutando Windows Vista.


Como la respuesta de Fernando Macedo, pero IMO menos invasiva:

def symlink(source, link_name): import os os_symlink = getattr(os, "symlink", None) if callable(os_symlink): os_symlink(source, link_name) else: import ctypes csl = ctypes.windll.kernel32.CreateSymbolicLinkW csl.argtypes = (ctypes.c_wchar_p, ctypes.c_wchar_p, ctypes.c_uint32) csl.restype = ctypes.c_ubyte flags = 1 if os.path.isdir(source) else 0 if csl(link_name, source, flags) == 0: raise ctypes.WinError()


Hay una manera de solucionar este problema, parcheando el módulo os en el inicio de su entorno python.

La función para crear enlaces simbólicos ya está disponible desde la API de Windows, solo necesita llamarla.

Durante el inicio de python, se intenta importar un módulo llamado sitecustomize.py , en el directorio site-packages . Usaremos este gancho para adjuntar nuestra función al módulo os.

Ponga este código en el archivo sitecustomize.py:

import os __CSL = None def symlink(source, link_name): ''''''symlink(source, link_name) Creates a symbolic link pointing to source named link_name'''''' global __CSL if __CSL is None: import ctypes csl = ctypes.windll.kernel32.CreateSymbolicLinkW csl.argtypes = (ctypes.c_wchar_p, ctypes.c_wchar_p, ctypes.c_uint32) csl.restype = ctypes.c_ubyte __CSL = csl flags = 0 if source is not None and os.path.isdir(source): flags = 1 if __CSL(link_name, source, flags) == 0: raise ctypes.WinError() os.symlink = symlink

El proceso de Python debe iniciarse con el privilegio habilitado "Crear enlaces simbólicos", esto no es un problema de Python, todos los programas que pretendan usar esta API de Windows lo necesitarán. Esto se puede hacer ejecutando su intérprete de Python desde un cmd.exe elevado. Una mejor alternativa es otorgar el privilegio al usuario, siempre que su edición de Windows se envíe con el editor de políticas de grupo requerido ( gpedit.msc ). Vea la captura de pantalla a continuación. Puede ajustar el valor para incluir cualquier usuario o grupo de seguridad que requiera este tipo de privilegio sin comprometer la seguridad de las cuentas administrativas.

Nota: Fragmento de código desde here