PyInstaller 的所有文档都讨论了包含单个文件。
是否可以包含一个目录,或者我应该编写一个函数来通过遍历我的包含目录来创建包含数组?
将以下内容粘贴到spec文件中的
a = Analysis()
后面,以递归方式遍历目录并将其中的所有文件添加到发行版中。
##### include mydir in distribution #######
def extra_datas(mydir):
def rec_glob(p, files):
import os
import glob
for d in glob.glob(p):
if os.path.isfile(d):
files.append(d)
rec_glob("%s/*" % d, files)
files = []
rec_glob("%s/*" % mydir, files)
extra_datas = []
for f in files:
extra_datas.append((f, f, 'DATA'))
return extra_datas
###########################################
# append the 'data' dir
a.datas += extra_datas('data')
这个问题比你想象的要容易。试试这个:
--add-data="path/to/folder/*;."
是的,您只需将目录添加到分析对象中,它们就会被复制。
a = Analysis(['main.py'],
datas = [('test/dir', 'test/dir')],
...)
只需使用
glob
:
from glob import glob
datas = []
datas += glob('/path/to/filedir/*')
datas += glob('/path/to/textdir/*.txt')
# ...
a.datas = datas
您最好将该文件夹复制到站点包中,并在相应的脚本中将其作为导入调用。然后 pyinstaller 会自动将包包含到进程中。确保之前通过 VS 或您喜欢的编码 IDE 测试脚本
这比尝试通过命令行重建目录结构要容易得多。尽管无需额外编码就无法通过requirements.txt工作流程方法重现它,但它清理了python到exe编译的工作流程。
如果您决定采取困难的方式,您可以使用 auto-py-to-exe 编写脚本,然后复制并粘贴整个“当前命令”部分并将其粘贴到命令行中。这将为您节省大量打字和更正的时间。
我花了 3 天时间,终于制作了一个可以工作的独立 exe,它重现了一个带有选择菜单的 python 脚本,该菜单使用前一种方法调用其他 python 脚本。后一种方法会产生不良结果。
如果您的脚本调用其他脚本或使用屏幕管理器等实现更改窗口,我不建议使用一个文件。它很可能会导致崩溃或系统资源过载,并且无法按预期运行。
旁注:如果您在任何应用程序中使用 kivy,最好使用 pyinstaller 5.6.2,这将避免与代码中的 kivy 实现相关的递归问题。
祝你好运。希望这有帮助。