2013-10-29 23 views
10

このquestionはこれまでに質問されており、PyInstallerが正常に動作しないようです。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) 

私は(IDLE以内)PYファイルを実行すると、私のアプリは完全に実行され、すべてのデータファイルをロードします。私は私のmainscript.pyファイルに次のコードを呼び出しています。私はpyInstallerの2.1(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/*.*' 

誰もが私が間違っていた任意のアイデアを持っていますか?ありがとう!

** EDITここで**

はまさに私が何をしたいです。

私のメインスクリプトには、以下のようなセットアップ(インポート)があります。基本的に私はそれでmatplotlibの、ベースマップ、およびリソース・パスのすべてを持ってできるようにしたい:私はpyInstallerの2.1を使用しています

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' 

。私はPython 2.7.5(32ビット)も使用しています。私のOSはWindows 8(64ビット)です。私のMatplotlibは1.3.0、Basemapは1.0.6です。 Wxpythonは2.8.12.1(Unicode)です。

私はコマンドに行きます:> pyinstaller myscript.py。これは私が少し編集する.specファイルを生成します。私は、データファイルが実行可能内にパックされなければならないので、これは1-ファイルを実行可能になりたい

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に問題がなかった。しかし、MatplotlibとBasemapのために2.1を使用する必要があります。誰かがこのexeを完全に構築できたら、調整する必要があることを教えてください。ありがとう!

**** **** EDIT

誰もがpy2exeでこれを行う方法を見つけ出すことができれば - あまりにも素晴らしいことだという。これを一つの実行可能ファイルにすることができれば、それは価値があります!

+0

これは問題だとは思っていませんが、Pyinstaller 2.1のバグはたくさんあるようですが、https://github.com/pyinstallerのgitバージョンを試してみてください。 –

+0

pyinstaller.orgの1つをダウンロードしました。これはpypiから取得するのと同じですか? – mcfly

+0

私はそう思います。どちらも2.1リリース版です。 –

答えて

11

私は問題を見ると思います。 data_filesをAnalysisオブジェクトに渡しているわけではありません。 は、ここで私は私の.specファイルに私のデータファイルを追加方法は次のとおりです。私はすべてで)(COLLECT使用していないよ

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') 

注意してください。

PyInstaller Spec File Operationで2.1のドキュメントをチェックアウトすると、--onefileモードではCOLLECT()が使用されないことがわかります。

sys._MEIPASSが指す抽出されたディレクトリを見ると、スペックファイルではデータファイルがまったく存在しないことがわかります。

こちらがお役に立てば幸いです。

関連する問題