包含使用Pyinstaller的目录

Sim*_*ght 19 python installation packaging include pyinstaller

Pyinstaller的所有文档都讨论了包含单个文件.是否可以包含目录,还是应该编写一个函数来遍历我的include目录来创建include数组?

sty*_*yts 19

将以下内容粘贴到a = Analysis()spec文件中以递归遍历目录并将其中的所有文件添加到分发中.

##### 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')
Run Code Online (Sandbox Code Playgroud)


den*_*ufa 13

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

/sf/answers/1447398291/

https://pythonhosted.org/PyInstaller/advanced-topics.html#the-toc-and-tree-classes

  • 感谢您的分享,使用[Tree类](https://pythonhosted.org/PyInstaller/advanced-topics.html#the-tree-class)为我解决了一个优雅的问题。现在我只需要这一行:`a.datas + = Tree('./ dir_to_include',prefix ='dir_to_include')` (4认同)

wed*_*oft 8

是的,您只需将目录添加到 Analysis 对象,然后它们就会被复制。

a = Analysis(['main.py'],
             datas = [('test/dir', 'test/dir')],
             ...)
Run Code Online (Sandbox Code Playgroud)


lem*_*yen 6

问题比你想象的要容易

尝试这个: --add-data="path/to/folder/*;."

希望能帮助到你 !!!

  • 这将包括 pyinstaller 输出根目录中 path/to/folder/ 中的所有文件以及子文件夹中的所有文件。但是,任何子文件夹结构都不会被保留 - 所有文件都将被展平到根目录。如果你想将文件包含在相同的目录结构中(但它仍然不会保留子文件夹结构),你可以使用 `--add-data="path/to/folder/*;path/to/folder /"` (2认同)

jdi*_*jdi 5

只是使用glob呢?

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

a.datas = datas
Run Code Online (Sandbox Code Playgroud)