¿Cómo hacer pywin32 trabajar con pyinstaller para hacer un ejecutable?

Estaba tratando de hacer un código donde tuve que cambiar el tiempo de creación de un archivo a tiempo de creación de otro archivo (copiar tiempo de creación de un archivo a otro). Podría encontrar algunas respuestas sobre cambiar el tiempo de creación en los siguientes enlaces y funcionan muy bien también.

¿Cómo cambio la fecha de creación de archivo de Windows?

Modificar archivo crear / acceder / escribir timetamp con python debajo de ventanas

Pero cuando intento poner el código mencionado en un ejecutable usando pyinstaller muestra el siguiente error:

AttributeError: 'pywintypes.datetime' objeto no tiene atributo 'astimezone '

¿Cómo puedo superar este error?

A continuación se muestra el código que se puede utilizar para reproducir la situatuión

import pywintypes, win32file, win32con, ntsecuritycon
import os

def changeFileCTime(fname, createdNewtime):
    wintime = pywintypes.Time(int(createdNewtime))
    winfile = win32file.CreateFile(fname, ntsecuritycon.FILE_WRITE_ATTRIBUTES, 0, None, win32con.OPEN_EXISTING, 0, None)
    win32file.SetFileTime(winfile, wintime, None, None)
    winfile.close()

def main():
    filename = input("File to copy creation time from: ")
    ctime = os.path.getctime(filename)

    filename = input("File to set ctime to: ")
    changeFileCTime(filename, ctime)

if __name__ == '__main__':
    main()

Versiones de programas:

  • Python - 3.8.2
  • Pyinstaller - 4.1

pyinstaller code:

pyinstaller --onefile --console test.py

donde prueba. py es el nombre de archivo con el código anterior.

Pregunta hecha hace 3 años, 4 meses, 27 días - Por Brian


2 Respuestas:

  • Para solucionar el error de AttributeError al utilizar pywin32 con pyinstaller, puedes intentar agregar una opción adicional "--hidden-import pywin32" al comando de pyinstaller. Esta opción le dice a pyinstaller que incluya el módulo pywin32 en el ejecutable.

    Por lo tanto, puedes probar el siguiente comando de pyinstaller:

    bash
    pyinstaller --onefile --hidden-import pywin32 --console test.py
    

    Con esta modificación, pyinstaller debería poder empaquetar correctamente el módulo pywin32 y evitar el error que estás experimentando. ¡Espero que esto te ayude a solucionar el problema!

    Respondida el Dec 20, 2020 a las 14:26 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás experimentando ocurre porque pywintypes.datetime no tiene un atributo astimezone cuando se empaqueta con PyInstaller. Para resolver este problema, puedes utilizar el siguiente código:

    
    import datetime as dt
    import pywintypes
    
    def changeFileCTime(fname, createdNewtime):
        wintime = pywintypes.Time(int(createdNewtime))
        winfile = win32file.CreateFile(fname, ntsecuritycon.FILE_WRITE_ATTRIBUTES, 0, None, win32con.OPEN_EXISTING, 0, None)
        win32file.SetFileTime(winfile, wintime, None, None)
        winfile.close()
    
    def main():
        filename = input("File to copy creation time from: ")
        ctime = os.path.getctime(filename)
    
        filename = input("File to set ctime to: ")
        ctime_dt = dt.datetime.fromtimestamp(ctime)
        ctime_wintime = pywintypes.Time(ctime_dt.year, ctime_dt.month, ctime_dt.day, ctime_dt.hour, ctime_dt.minute, ctime_dt.second, ctime_dt.microsecond)
        changeFileCTime(filename, ctime_wintime)
    
    if __name__ == '__main__':
        main()
    

    Este código utiliza datetime en lugar de pywintypes.datetime para crear un objeto datetime a partir de la marca de tiempo y luego lo convierte a pywintypes.Time utilizando ctime_wintime antes de pasarlo a changeFileCTime.

    También debes asegurarte de que el archivo pywintypes.dll esté presente en el directorio donde se ejecuta tu ejecutable empaquetado.

    Nota: Este código asumirá que la marca de tiempo de creación se almacena en segundos desde la época, que es el formato utilizado por os.path.getctime. Si la marca de tiempo se almacena en un formato diferente, es posible que debas ajustarla en consecuencia.

    Respondida el Dec 20, 2020 a las 14:36 - por Gemini

    Votos positivos: 0 | Votos negativos: 0