¿Cómo obtener el nombre de archivo corto de Windows en python?

Necesito determinar el nombre de archivo corto de Windows a partir de mi código de Python. Para eso puedo encontrar una solución usando el win32api.

import win32api long_file_name='C:\Program Files\I am a file' short_file_name=win32api.GetShortPathName(long_file_name) 

Referencia: http://blog.lowkster.com/2008/10/spaces-in-directory-names-i-really-love.html

Desafortunadamente para eso necesito instalar pywin32 o ActivePython que no es posible en mi caso.

También referencia de SO:

Obtener ruta corta en python: Obtener ruta corta en python

Puedes usar ctypes . Según la documentación en MSDN , GetShortPathName está en KERNEL32.DLL . Tenga en cuenta que las funciones reales son GetShortPathNameW for w ide (Unicode) y GetShortPathNameA para caracteres de un solo byte. Como los caracteres anchos son más generales, usaremos esa versión. Primero, configura el prototipo de acuerdo a la documentación:

 import ctypes from ctypes import wintypes _GetShortPathNameW = ctypes.windll.kernel32.GetShortPathNameW _GetShortPathNameW.argtypes = [wintypes.LPCWSTR, wintypes.LPWSTR, wintypes.DWORD] _GetShortPathNameW.restype = wintypes.DWORD 

GetShortPathName se usa primero llamándolo sin un búfer de destino. Devolverá la cantidad de caracteres que necesita para crear el búfer de destino. Luego lo llamas de nuevo con un búfer de ese tamaño. Si, debido a un problema con TOCTTOU , el valor de retorno es aún mayor, sigue intentándolo hasta que lo hayas hecho bien. Asi que:

 def get_short_path_name(long_name): """ Gets the short path name of a given long path. http://stackoverflow.com/a/23598461/200291 """ output_buf_size = 0 while True: output_buf = ctypes.create_unicode_buffer(output_buf_size) needed = _GetShortPathNameW(long_name, output_buf, output_buf_size) if output_buf_size >= needed: return output_buf.value else: output_buf_size = needed