Estoy tratando de compilar un archivo python con Nuitka en lugar de Pyinstaller. Todo va muy bien excepto por el hecho de que no entiendo cómo debo agregar otro archivo de datos al archivo de python.
El problema
Si quiero agregar una imagen a mi archivo python en Pyinstaller (en Windows), haría lo siguiente:
wine /root/.wine/drive_c/Python27/pyinstaller.exe --add-data "/root/Downloads/car.jpg;." --onefile --noconsole --icon /root/Downloads/icon.ico pythonfile.pyAhora, si abriera este archivo exe, ejecutaría el archivo python y abriría el archivo car.jpg.
Quiero hacer algo similar usando Nuitka. Cuando miré la documentación de Nuitka, vi que probablemente necesitaba usar el --include-data-file=<source>=<target> .
Intenté esto y no dio errores, pero cuando abro el archivo exe creado, no abre el archivo dado. Todos los demás argumentos funcionaron como quería, por lo que solo el argumento --include-data-file no da el resultado deseado
Este es el comando Nuitka que probé:
.\python.exe -m nuitka --mingw64 .\pythonprogram.py --standalone --onefile --windows-icon-from-ico=pdf.ico --windows-disable-console --include-data-file=C:\Users\User\AppData\Local\Programs\Python\Python39\*.pdf=mypdf.pdfMis preguntas):
¡Gracias por adelantado!
En primer lugar, cuando encuentre un comportamiento inesperado en Nuitka (en este caso, esperaría que se abriera un archivo, lo cual no sucedió) recomiendo eliminar el --windows-disable-console y observar la salida del terminal; sin él, la depuración del programa compilado es prácticamente imposible. También puede obtener mucha información analizando la salida de Nuitka durante la transpilación y la compilación (por ejemplo, puede aparecer una advertencia informándole sobre la inclusión del complemento de numpy para agregar soporte para el módulo numpy).
Ahora, pasando a tus preguntas:
- ¿Estoy usando el argumento correcto?
Sí, el argumento --include-data-file=<source>=<target> es correcto si lo que desea es incrustar un archivo.
Sin embargo, lo que es muy importante cuando se trata de programas compilados con el argumento --onefile es cómo se cargan los archivos internamente , en los archivos .py.
Siento que lo mejor que puedo hacer es mostrar un ejemplo propio (estoy usando pygame para mi proyecto, pero esta forma de cargar archivos debería funcionar en cualquier circunstancia):
import os import pygame def load_file(file_name: str) -> str: return os.path.join(os.path.dirname(__file__), file_name) image_1_sprite = pygame.image.load(load_file("textures/image_1.png")) Entonces usaría Nuitka como tal: python -m nuitka --onefile --include-data-dir=../workingdir/textures=textures main.py o, si desea incluir solo un archivo, python -m nuitka --onefile --include-data-file=../workingdir/textures/image_1.png=textures/image_1.png main.py , donde workingdir es el directorio en el que reside main.py (recomiendo usar rutas relativas para hacer el repositorio portátil, porque si alguien descargara su código fuente y lo guardara, por ejemplo, en el disco duro D:\, el comando ejecutado fallaría).