包含使用 PyInstaller 的目录

问题描述 投票:0回答:6

PyInstaller 的所有文档都讨论了包含单个文件。

是否可以包含一个目录,或者我应该编写一个函数来通过遍历我的包含目录来创建包含数组?

python installation include pyinstaller packaging
6个回答

23
投票

将以下内容粘贴到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')

18
投票

这个问题比你想象的要容易。试试这个:

--add-data="path/to/folder/*;."


10
投票

是的,您只需将目录添加到分析对象中,它们就会被复制。

a = Analysis(['main.py'],
             datas = [('test/dir', 'test/dir')],
             ...)

8
投票

只需使用

glob

from glob import glob

datas = []
datas += glob('/path/to/filedir/*')
datas += glob('/path/to/textdir/*.txt')

# ...

a.datas = datas

0
投票

您最好将该文件夹复制到站点包中,并在相应的脚本中将其作为导入调用。然后 pyinstaller 会自动将包包含到进程中。确保之前通过 VS 或您喜欢的编码 IDE 测试脚本

这比尝试通过命令行重建目录结构要容易得多。尽管无需额外编码就无法通过requirements.txt工作流程方法重现它,但它清理了python到exe编译的工作流程。

如果您决定采取困难的方式,您可以使用 auto-py-to-exe 编写脚本,然后复制并粘贴整个“当前命令”部分并将其粘贴到命令行中。这将为您节省大量打字和更正的时间。

我花了 3 天时间,终于制作了一个可以工作的独立 exe,它重现了一个带有选择菜单的 python 脚本,该菜单使用前一种方法调用其他 python 脚本。后一种方法会产生不良结果。

如果您的脚本调用其他脚本或使用屏幕管理器等实现更改窗口,我不建议使用一个文件。它很可能会导致崩溃或系统资源过载,并且无法按预期运行。

旁注:如果您在任何应用程序中使用 kivy,最好使用 pyinstaller 5.6.2,这将避免与代码中的 kivy 实现相关的递归问题。

祝你好运。希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.