2012-01-15 14 views
8

Mam problem z programem do usuwania puntów podczas dodawania niektórych plików danych, takich jak obrazy i txts do programu Pythona. Na przykład utworzyłem pasek narzędzi z ikonami i przechowuję je w oddzielnym folderze o nazwach obrazów. Mam również kilka plików txt i xml do przechowywania niektórych konfiguracji. Te pliki XML txt są przechowywane w innym folderze o nazwie data_files. Wszystkie pliki py są przechowywane w innym folderze o nazwie source.Kompilacja obrazów i niektórych plików konfiguracyjnych, takich jak pliki txt i xml, za pomocą narzędzia do usuwania puzzli

Kiedy próbuję skompilować ten program python za pomocą programu do usuwania, program piorący może z powodzeniem zbudować cały folder źródłowy, ale folderów obrazów i folderów data_files nie można zbudować. Sprawdziłem dokumentację programu, ale nie mogłem znaleźć żadnego rozwiązania. Zrobiłem wiele wyszukiwań w Google i uznałem, że tylko pomocna jest zasada this, ale jest to bardzo nieadekwatny zasób.

Moje główne pytanie brzmi: Jak mogę skompilować plik exe z osobno zbudowanym folderem, takim jak obrazy i pliki konfiguracyjne za pomocą narzędzia do usuwania piosenek?

Edytuj: Znalazłem rozwiązanie. Podczas tworzenia pliku spec musisz podać parametr a.datas.

# -*- mode: python -*- 
a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), '/home/vmode/Desktop/derlem2/sources/TextSTAT.py'], 
      pathex=['/home/pyinstaller']) 
a.datas += [("Images/New.gif","/home/vmode/Desktop/derlem2/Images/New.gif","DATA")] 
a.datas += [("Images/Open.gif","/home/vmode/Desktop/derlem2/Images/Open.gif","DATA")] 
a.datas += [("Images/Column.gif","/home/vmode/Desktop/derlem2/Images/Column.gif","DATA")] 
pyz = PYZ(a.pure) 
exe = EXE(pyz, 
      a.scripts, 
      a.binaries, 
      a.zipfiles, 
      a.datas, 
      name=os.path.join('dist', 'TextSTAT'), 
      debug=False, 
      strip=False, 
      upx=True, 
      console=1) 

Powyższy kod specyfikacji jest przeznaczony do mojego projektu. Jak widać w tym kodzie specyfikacji, zamieściłem 3 ikony do zbudowania za pomocą programu Pythona. Podczas generowania programu znajduje się samodzielny plik wykonywalny z osadzonymi ikonami.

Ale co, jeśli mamy tak dużo plików? Załóżmy, że mamy 1000 ikon do użycia w naszym programie. Zapisywanie pliku do pliku spersonalizowanego jest bardzo niewystarczające. Musi istnieć system pętli do odczytywania katalogu plików i dynamicznego dodawania tych plików. Ale nie mogłem znaleźć sposobu na dynamiczne dodawanie tych plików. Nie ma żadnej szansy na dodanie tak wielu plików ręcznie, jak sądzę. Jeśli ktokolwiek wie, proszę udostępnij.

+0

Spróbuj 'cx_freeze'. Próbowałem 'py2exe',' pyinstaller', jakiegoś innego losowego programu, a tylko 'cx_freeze' pracował dla mnie (użyłem PyQt4). Jeśli chcesz zobaczyć mój kod do tworzenia plików binarnych, to jest na GitHub: https://github.com/Blender3D/Bindery/blob/master/tools/binary.py – Blender

+0

Dziękuję za zainteresowanie. Ale cx_freeze tylko kompiluje plik .exe. Chcę zbudować program na wszystkich platformach. Więc muszę użyć programu do usuwania paczek. Ale popracuj trochę. – user1150508

+0

Nie, 'cx_freeze' tworzy pliki binarne również dla systemu Linux. Mac wymaga Py2app. – Blender

Odpowiedz

5

Podczas tworzenia mojego pliku wykonywalnego natknąłem się również na ten problem. Ponieważ plik .spec używa Pythona, moim rozwiązaniem był moduł glob.

Linia 2 dotycząca icon.ico była oddzielna, ponieważ miała inne rozszerzenie pliku i dlatego może zostać wykluczona. ".. \ pathfinder" to ścieżka do wszystkich plików mojego programu (względna z katalogu Pyinstaller). glob przeszukuje katalog dla wszystkich plików .png (mam 65 i odmówił zapisania ich wszystkich ręcznie) i zwraca ich listę jako ciągi, pełny katalog względny nienaruszony. Aby oddzielić go na listę nazw plików, użyłem string.split() na ukośniku odwrotnym. Następnie dla każdej z nich dołącz do listy utworzonej przez użytkownika krotkę końcowej części rozciętego ciągu znaków (która w efekcie stanie się po prostu nazwą pliku obrazu) i pełną ścieżkę dostępu. Na koniec, wraz z listą wszystkich plików, dodaj ją do pliku.datas.

Potwierdziłem za pomocą wiersza poleceń, że to rzeczywiście działa poprawnie i można ponownie skopiować pętlę dla wszelkich dodatkowych rozszerzeń plików.

Niestety, mimo że wydaje się, że wciąga i załącza nazwy plików poprawnie, mój plik wykonywalny nadal nie wydaje się być tworzony z plikami (lub plik wykonywalny nie może znaleźć plików w jego własnych danych) i nadal muszę mieć nieprzetworzone obrazy w tym samym katalogu, aby działał; być może mam błędnie zamówione elementy krotki (a więc jeśli tak, to powinieneś odpowiednio dostosować mój kod). Mam nadzieję, że to dynamiczne obciążenie nadal będzie działać. imageParts [-1] reprezentuje każdą nazwę pliku .png, a eachImage reprezentuje pełną ścieżkę (lub ścieżkę względną, jeśli jest to użyte w glob).

1

Jeśli wszystkie obrazy są wymienione w tym samym katalogu, można użyć Drzewo

dict_tree = Tree('/home/vmode/Desktop/derlem2/Images', prefix = 'Images') 
a.datas += dict_tree