Tutta la documentazione di Pyinstaller parla di includere singoli file. È possibile includere una directory o scrivere una funzione per creare l'array di inclusione attraversando la mia directory di inclusione?Includere una directory usando Pyinstaller
risposta
mi sono sorpreso che nessuno ha menzionato l'opzione ufficiale ha sostenuto con Tree()
:
https://stackoverflow.com/a/20677118/2230844
https://pythonhosted.org/PyInstaller/advanced-topics.html#the-toc-and-tree-classes
Che dire semplicemente usando glob
?
from glob import glob
datas = []
datas += glob('/path/to/filedir/*')
datas += glob('/path/to/textdir/*.txt')
...
a.datas = datas
Incollare il seguente testo dopo a = Analysis()
nel file spec per attraversare una directory ricorsivamente e aggiungere tutti i file in essa contenuti alla distribuzione.
##### 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')
Mi scusi, ma io non capisco proprio. Ho una directory chiamata '~/Scripts'. I miei dati sono memorizzati in ~ ~/Scripts/Data'. Dovrei sostituire 'a.datas + = extra_datas ('data')' da 'a.datas + = extra_datas ('Data')'? –
Se il tuo script pyInstaller si trova anche in 'Script' e lo chiami con' python mybuildscript.py' da dentro 'Script' allora sì, devi sostituire con 'Dati', altrimenti usa' .' e '..' per navigare l'albero delle directory. – styts
Grazie per la condivisione, utilizzando [la classe Tree] (https://pythonhosted.org/PyInstaller/advanced-topics.html#the-tree-class) l'ho risolto in modo elegante. Ora ho solo bisogno di questa riga: 'a.datas + = Tree ('./ dir_to_include', prefisso = 'dir_to_include')' – sunyata
sì, penso che non sia documentato abbastanza bene, ma questo open-source, quindi I PR sono i benvenuti :) – denfromufa