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