Cod*_*der 7 python compilation pyinstaller python-3.x nuitka
我正在尝试使用 Nuitka 而不是 Pyinstaller 编译 python 文件。一切都很顺利,除了我不明白如何将另一个数据文件添加到 python 文件中。
问题
如果我想将图像添加到 Pyinstaller(在 Windows 中)中的 python 文件中,我会这样做:
wine /root/.wine/drive_c/Python27/pyinstaller.exe --add-data "/root/Downloads/car.jpg;." --onefile --noconsole --icon /root/Downloads/icon.ico pythonfile.py
Run Code Online (Sandbox Code Playgroud)
现在,如果我打开这个 exe 文件,我将运行 python 文件并打开 car.jpg 文件。
我想使用 Nuitka 做类似的事情。当我查看 Nuitka 的文档时,我发现我可能需要使用该--include-data-file=<source>=<target>参数。
我尝试了这个,它没有给出错误,但是当我打开创建的 exe 文件时,它不会打开给定的文件。所有其他参数都按我想要的方式工作,因此只有 --include-data-file 参数没有给出想要的结果
这是我尝试过的 Nuitka 命令:
.\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.pdf
Run Code Online (Sandbox Code Playgroud)
我的问题:
提前致谢!
首先,当在 Nuitka 中遇到意外行为时(在本例中,您希望打开一个文件,但事实并非如此),我强烈建议删除该--windows-disable-console参数并观察终端输出;如果没有它,调试编译的程序几乎是不可能的。您还可以通过分析 Nuitka 在转译和编译过程中的输出来获取大量信息(例如,可能会出现一条警告,通知您包含 numpy 的插件以添加对 numpy 模块的支持)。
现在,继续回答您的问题:
- 我使用了正确的论点吗?
是的,--include-data-file=<source>=<target>如果您想要嵌入一个文件,则参数是正确的。
然而,当涉及到使用--onefile参数编译的程序时,非常重要的是如何在 .py 文件中内部加载文件。
我觉得我能做的最好的事情就是展示我自己的一个例子(我在我的项目中使用pygame,但这种加载文件的方式应该在任何情况下都有效):
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"))
Run Code Online (Sandbox Code Playgroud)
然后,我将这样使用 Nuitka:python -m nuitka --onefile --include-data-dir=../workingdir/textures=textures main.py或者,如果您只想包含一个文件,python -m nuitka --onefile --include-data-file=../workingdir/textures/image_1.png=textures/image_1.png main.py则workingdir其所在的目录在main.py哪里(我建议使用相对路径使存储库可移植,因为如果有人要下载您的源代码并保存例如,在 D:\ 硬盘驱动器上 - 执行的命令将失败)。