¿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 atributoastimezone
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 depywintypes.datetime
para crear un objetodatetime
a partir de la marca de tiempo y luego lo convierte apywintypes.Time
utilizandoctime_wintime
antes de pasarlo achangeFileCTime
.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