2013-10-29 7 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 फ़ाइल (निष्क्रिय अंदर), चलाने के लिए, मेरे ऐप पूरी तरह से और भार डेटा फ़ाइलों के सभी चलाता है। हालांकि, जब मैं इसे 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, Basemap, और संसाधन पथ सब करने में सक्षम होना चाहता हूँ:

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 उपयोग कर रहा हूँ। मैं पायथन 2.7.5 (32 बिट) का भी उपयोग कर रहा हूं। मेरा ओएस विंडोज 8 (64 बिट) है। मेरा Matplotlib 1.3.0 है और Basemap 1.0.6 है। Wxpython 2.8.12.1 (यूनिकोड) है।

मैं कमांड पर जाता हूं और करता हूं: > 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 के साथ कोई समस्या नहीं है। हालांकि, मुझे Matplotlib और Basemap की वजह से 2.1 का उपयोग करने की आवश्यकता है। अगर कोई इस exe पूरी तरह से निर्माण कर सकते हैं - क्या आप कृपया मुझे बता सकते हैं कि मुझे समायोजित करने की क्या ज़रूरत है? धन्यवाद!

**** संपादित ****

किसी को भी यह पता लगाने कर सकते हैं कैसे py2exe के साथ ऐसा करना - वह भी बहुत अच्छा होगा। किसी भी तरह से मैं इसे एक निष्पादन योग्य में प्राप्त कर सकता हूं, यह इसके लायक होगा!

+0

मुझे यकीन नहीं है कि यह समस्या है, लेकिन पाइइंस्टॉलर 2.1 के पीपीआई संस्करण में बग का एक गुच्छा है, तो https://github.com/pyinstaller पर गिट संस्करण का उपयोग करने का प्रयास करें। –

+0

मैंने pyinstaller.org के सीधे एक को डाउनलोड किया - क्या यह इसे पीपीआई से प्राप्त करने जैसा ही है? – mcfly

+0

मुझे उम्मीद है। वे 2.1 रिलीज संस्करण दोनों हैं। –

उत्तर

11

मुझे लगता है कि मुझे समस्या दिखाई दे रही है। आप अपने विश्लेषण ऑब्जेक्ट में data_files नहीं खिला रहे हैं।

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

सूचना मैं() सब पर इकट्ठा का उपयोग नहीं कर रहा हूँ: यहाँ कैसे मैं अपने .spec फ़ाइल में अपने डेटा फ़ाइलों को जोड़ रहा है।

यदि आप 2.1 दस्तावेज़ों को चेकआउट करते हैं: PyInstaller Spec File Operation आप देखेंगे कि COLLECT() का उपयोग --onefile मोड के लिए नहीं किया जाता है।

यदि आप sys._MEIPASS द्वारा इंगित निकाली गई निर्देशिका को देखते हैं तो आपको शायद यह पता चलेगा कि आपकी spec फ़ाइल के साथ डेटा फ़ाइल बस बिल्कुल नहीं है।

मुझे उम्मीद है कि इससे मदद मिलती है।

संबंधित मुद्दे