2016-08-15 3 views
4

Я расчесывание переполнения стека и остальную часть сети о том, как добавить файлы данных в моем питона приложения:Любой успешно упакованный файл данных в один файл с помощью Pyinstaller?

import Tkinter 

class simpleapp_tk(Tkinter.Tk): 
    def __init__(self,parent): 
     Tkinter.Tk.__init__(self,parent) 
     self.parent = parent 
     self.initialize() 

    def initialize(self): 
     self.grid() 

--- Everything Fine Here --- 

     self.B = Tkinter.Button(self, text = 'Create Document', command = self.OnButtonClick) 
     self.B.grid(column = 0, row = 6) 


    def OnButtonClick(self): 
     createDoc() 

if __name__ == "__main__": 
    app = simpleapp_tk(None) 
    app.title('Receipt Form') 
    app.iconbitmap(os.getcwd() + '/M.ico') 
    app.mainloop() 

Я попытался с помощью .spec файла без везения

Onedir работает отлично , однако, когда я пытаюсь скомпилировать в один исполняемый файл, он дает ошибку, что файл «M.ico» не определен.

Если кто-то смог связать файлы данных с помощью pyinstaller в один файл. Пожалуйста помоги. Благодарю.

Я на Windows 10 компьютера под управлением Python 2.7 с PyInstaller 3.2

+0

Я думаю, что ваша проблема в том, что 'pyinstaller' [использует временную папку для извлечения файлов] (https://pythonhosted.org/PyInstaller/advanced-topics.html#bootloader). Вы указали, что в вашем коде для замороженного приложения, как это сделано [здесь] (http://stackoverflow.com/questions/7674790/bundling-data-files-with-pyinstaller-onefile). – Repiklis

+0

@ Repiklis Хорошо, как именно я могу это использовать? Я делаю 'app.iconbitmap (resource_path ('/ M.ico'))' –

+0

Это очень похоже на [this] (http://stackoverflow.com/questions/38874563/pypandoc-in-combination-with-pyinstaller/ 38957523 # 38957523). Вы должны включить свой значок в «ресурсы» в файле spec и добавить две строки в нижней части ответа в вашем коде (перед установкой значка). Если у вас все еще есть проблемы, дайте мне знать. – Repiklis

ответ

2

Вы должны указать файл каждые данные, которые вы хотите встраивается в pyinstaller .spec файл, или с помощью параметров командной строки (.spec намного проще.) Ниже мой .spec файл, с разделом «данных»:

# -*- mode: python -*- 

block_cipher = None 


a = Analysis(['pubdata.py'], 
      pathex=['.', '/interface','/recommender'], 
      binaries=None, 
      datas=[('WordNet/*.txt','WordNet'), 
      ('WordNet/*.json','WordNet'), 
      ('WordNet/pdf_parsing/*.json','pdf_parsing'), 
      ('WordNet/pdf_parsing/*.xml','pdf_parsing'), 
      ('images/*.png','images'), 
      ('database/all_meta/Flybase/*.txt','all_meta'), 
      ('database/all_meta/Uniprot/*.txt','all_meta'), 
      ('database/json_files/*.json','json_files'), 
      ('Data.db','.')], 

      hiddenimports=['interface','recommender'], 
      hookspath=[], 
      runtime_hooks=[], 
      excludes=[], 
      win_no_prefer_redirects=False, 
      win_private_assemblies=False, 
      cipher=block_cipher) 
pyz = PYZ(a.pure, a.zipped_data, 
      cipher=block_cipher) 
exe = EXE(pyz, 
      a.scripts, 
      exclude_binaries=True, 
      name='GUI', 
      debug=False, 
      strip=False, 
      upx=True, 
      console=True) 
coll = COLLECT(exe, 
       a.binaries, 
       a.zipfiles, 
       a.datas, 
       strip=False, 
       upx=True, 
       name='GUI') 
app = BUNDLE(coll, 
      name='App.app', 
      icon=None) 

После этого, если вы пытаетесь получить доступ к любому файлу данных, указанным в файле .spec, в вашем коде, вы должны использовать Pyinstaller-х _MEIPASS, чтобы ссылаться на ваш файл. Вот как я сделал это с файлом под названием Data.db:

import sys 
import os.path 

     if hasattr(sys, "_MEIPASS"): 
      datadir = os.path.join(sys._MEIPASS, 'Data.db') 
     else: 
      datadir = 'Data.db' 

     conn = lite.connect(datadir) 

Этот метод выше заменить это заявление, которое было само по себе:

conn = lite.connect("Data.db") 

Эта ссылка помог мне, когда я собирался через то же самое: https://irwinkwan.com/2013/04/29/python-executables-pyinstaller-and-a-48-hour-game-design-compo/

Надеюсь, это поможет!

 Смежные вопросы

  • Нет связанных вопросов^_^