2013-10-29 73 views
10

這個question已經被問過了,我似乎無法讓我的PyInstaller正常工作。我在mainscript.py文件調用下面的代碼:用PyInstaller 2.1和MEIPASS錯誤捆綁數據文件--onefile

def resource_path(relative_path): 
    """ Get absolute path to resource, works for dev and for PyInstaller """ 
    try: 
     # PyInstaller creates a temp folder and stores path in _MEIPASS 
     base_path = sys._MEIPASS 
    except Exception: 
     base_path = os.path.abspath(".") 

    return os.path.join(base_path, relative_path) 

當我運行PY文件(IDLE內),我的應用程序完美和負荷運行的所有數據文件。然而,當我與PyInstaller 2.1捆綁它(一個文件的方法),我得到的exe文件後出現以下錯誤構建:

Traceback (most recent call last): 
File "<string>", line 37, in <module> 
WindowsError: [Error 3] The system cannot find the path 
specified: 'C:\\Users\\Me\\AppData\\Local\\Temp\\_MEI188722\\eggs/*.*' 

沒有人有我哪裏錯了什麼想法?謝謝!

**編輯**

這正是我想要做的。

我的主腳本有一個如下所示的設置(導入)。基本上我希望能夠有Matplotlib,底圖和資源路徑都在裏面:

import os,sys 
import matplotlib 
matplotlib.use('WX') 
import wx 
from matplotlib.backends.backend_wx import FigureCanvasWx as FigureCanvas 
from matplotlib.backends.backend_wx import NavigationToolbar2Wx 
from mpl_toolkits.basemap import Basemap 
from matplotlib.figure import Figure 
import matplotlib.pyplot as plt 
import Calculate_Distance # A personal py file of mine 

def resource_path(relative_path): 
    """ Get absolute path to resource, works for dev and for PyInstaller """ 
    try: 
     # PyInstaller creates a temp folder and stores path in _MEIPASS 
     base_path = sys._MEIPASS 
    except Exception: 
     base_path = os.path.abspath(".") 

    return os.path.join(base_path, relative_path) 

bmap=wx.Bitmap(resource_path('test_image.png')) 

print 'hello' 

我使用PyInstaller 2.1。我也使用Python 2.7.5(32位)。我的操作系統是Windows 8(64位)。我的Matplotlib是1.3.0,底圖是1.0.6。 Wxpython是2.8.12.1(Unicode)。

我去指揮,做:> pyinstaller myscript.py。這生成我的.spec文件,我稍微編輯。下面是我的編輯規範文件:

data_files = [('Calculate_Distance.py', 'C:\\Users\\Me\\Documents\\MyFolder\\Calculate_Distance.py', 
       'DATA'), ('test_image.png', 'C:\\Users\\Me\\Documents\\MyFolder\\test_image.png', 
       'DATA')] 

includes = [] 
excludes = ['_gtkagg', '_tkagg', 'bsddb', 'curses', 'email', 'pywin.debugger', 
      'pywin.debugger.dbgcon', 'pywin.dialogs', 'tcl', 
      'Tkconstants', 'Tkinter'] 
packages = [] 
dll_excludes = [] 
dll_includes = [] 

a = Analysis(['myscript.py'], 
      pathex=['C:\\Users\\Me\\Documents\\MyFolder','C:\\Python27\\Lib\\site-packages\\mpl_toolkits\\basemap\\*'], 
      hiddenimports=[], 
      hookspath=None, 
      runtime_hooks=None) 

pyz = PYZ(a.pure) 
exe = EXE(pyz, 
      a.scripts, 
      a.binaries - dll_excludes + dll_includes + data_files,   
      name='MyApplication.exe', 
      debug=False, 
      strip=None, 
      upx=True, 
      console=True) 
coll = COLLECT(exe, 
       a.binaries, 
       a.zipfiles, 
       a.datas, 
       strip=None, 
       upx=True, 
       name='MyApplication') 

我想這是一個文件可執行使數據文件應在可執行文件內包裝。在其他pyinstallers我通常沒有問題與MEIPASS。但是,我需要使用2.1,因爲Matplotlib和Basemap。如果有人可以完美地構建這個exe文件 - 你能告訴我我需要調整什麼嗎?謝謝!

**** ****編輯

如果任何人都可以找出如何用py2exe做到這一點 - 這將是巨大的。任何我可以把它變成單個可執行文件的方式都是值得的!

+0

我不確定這是否是這裏的問題,但pypi版本的Pyinstaller 2.1似乎有一堆bug,請嘗試使用https://github.com/pyinstaller上的git版本。 –

+0

我下載了pyinstaller.org的一個 - 這和從pypi得到它一樣嗎? – mcfly

+0

我希望如此。它們都是2.1發行版本。 –

回答

11

我想我看到了問題。您不會將data_files提供給Analysis對象。 以下是我加我的數據文件在我的.spec文件:

a = Analysis(....) 
a.datas += [('7z.dll', '7z.dll', 'DATA')] 
a.datas += [('7z.exe', '7z.exe', 'DATA')] 
a.datas += [('collection.xml', 'collection.xml', 'DATA')] 
a.datas += [('License.html', 'License.html', 'DATA')] 

pyz = PYZ(a.pure) 

exe = EXE(pyz, 
      a.scripts + [('O', '', 'OPTION')], 
      a.binaries, 
      a.zipfiles, 
      a.datas, 
      name=os.path.join('dist', 'blah.exe'), 
      debug=False, 
      strip=None, 
      upx=False, 
      console=True, 
      icon=r'..\NCM.ico') 

請注意,我沒有使用到付()在所有。

如果您在以下位置簽出2.1文檔:PyInstaller Spec File Operation您會注意到COLLECT()不用於--onefile模式。

如果你看看sys._MEIPASS指向的提取目錄,你可能注意到你的spec文件中根本沒有數據文件。

我希望這會有所幫助。

相關問題