Python 包括使用Pyinstaller的目录

Python 包括使用Pyinstaller的目录,python,installation,include,pyinstaller,packaging,Python,Installation,Include,Pyinstaller,Packaging,Pyinstaller的所有文档都谈到了包含单个文件。 是否可以包含一个目录,或者我是否应该编写一个函数来通过遍历我的include目录来创建include数组?使用glob怎么样 from glob import glob datas = [] datas += glob('/path/to/filedir/*') datas += glob('/path/to/textdir/*.txt') ... a.datas = datas 在spec文件中的a=Analysis()之后粘贴以下内

Pyinstaller的所有文档都谈到了包含单个文件。
是否可以包含一个目录,或者我是否应该编写一个函数来通过遍历我的include目录来创建include数组?

使用
glob
怎么样

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

a.datas = datas

在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')

我感到惊讶的是,没有人使用
Tree()
提到官方支持的选项:


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

试试这个:
--add data=“path/to/folder/*;”


希望对你有帮助

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

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

对不起,我真的不明白。我有一个名为
~/Scripts
的目录。我的数据存储在
~/Scripts/data
中。我是否应该用
a.datas+=extra_datas('data')
替换
a.datas+=extra_datas('data')
?如果您的pyInstaller脚本也在
Scripts
中,并且您从
Scripts
中用
python mybuildscript.py
调用它,那么是的,您应该用
data
替换,否则,请使用
浏览目录树。感谢您的共享,以优雅的方式为我解决了此问题。现在我只需要这一行:
a.datas+=Tree('./dir_to_include',prefix='dir_to_include')
yep,我认为它的文档记录得不够好,但是这个开源的,所以PRs是受欢迎的:)至少对于pyinstaller 4.2来说,数据字段需要作为元组添加。如果要添加多个文件夹,它需要类似于:
。。。数据=[('test/dir','test/dir'),('test2/dir','test2/dir')]…
这将包括pyinstaller输出根目录中path/to/folder/中的所有文件以及子文件夹中的所有文件。但是,不会保留任何子文件夹结构-所有文件都将展平到根目录。如果您想将文件包含在相同的目录结构中(但它仍然不会保留子文件夹结构),可以使用
--add data=“path/to/folder/*;path/to/folder/”