2016-08-15 21 views
4

我一直在梳理堆棧溢出,並就如何將數據文件添加到我的Python應用程序的Web的休息:任何人使用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的數據文件捆綁到一個文件中。請幫忙。謝謝。

我運行的Python 2.7與3.2 PyInstaller

+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文件的'resources'中,並在代碼的答案底部添加兩行(在設置圖標之前)。如果您仍有問題,請告訴我。 – Repiklis

回答

2

您必須指定的每個數據文件要在pyinstaller的.spec文件添加,或通過命令行選項(在Windows 10計算機上的.spec要容易得多。 )下面是我的.spec文件,以「DATAS」部分:

# -*- 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/

希望這會有所幫助!

相關問題