2011-06-27 19 views
8

Próbuję wygenerować plik .exe ze skryptu Pythona, który używa wxPython i Matplotlib i wygląda na niemożliwy.przy użyciu py2exe z wxPython i Matplotlib

przywozu robię (związane z matplotlib) są następujące:

from numpy import *
import matplotlib
matplotlib.interactive(True)
matplotlib.use("WXAgg")
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigCanvas
from matplotlib.ticker import MultipleLocator

Oto plik setup.py Próbuję użyć:

from distutils.core import setup 
import py2exe 
import matplotlib 

opts = { 
'py2exe': {"bundle_files" : 3, 
      "includes" : [ "matplotlib", 
      "matplotlib.backends", 
      "matplotlib.backends.backend_wxagg", 
         "numpy", 
         "matplotlib.ticker", 
         "matplotlib.figure", "_wxagg"], 
      'excludes': ['_gtkagg', '_tkagg', '_agg2', 
         '_cairo', '_cocoaagg', 
         '_fltkagg', '_gtk', '_gtkcairo', ], 
      'dll_excludes': ['libgdk-win32-2.0-0.dll', 
         'libgobject-2.0-0.dll'] 
      } 
    } 

setup(


    windows=[{'script':'starHunter.py', 'icon_resources':[(1, 'icon.ico')]}], 

    data_files=matplotlib.get_py2exe_datafiles(), 

    options=opts, 

    zipfile=None 
) 

I "zawsze otrzymuję" Nie można znaleźć plików danych matplotlib "po próbie uruchomienia pliku .exe, który swoją drogą został pomyślnie utworzony.

Dodatkowe informacje: Używam Pythona 2.6, matplotlib 0.99.3, WxPython 2.8.11.0 w systemie Windows XP

góry dziękuję. Każda pomoc zostanie doceniona!

Cheers, Andressa Sivolella

Odpowiedz

0

Istnieje szereg problemów z matplotlib.get_py2exe_datafiles(), tak wygodne, jak byłoby, gdyby to działało. Dobrym pomysłem jest także określenie, z którego backendu korzystać. Oto import matplotlib pracy Niedawno używane:

from distutils.core import setup 
import py2exe 
from glob import glob 

import matplotlib  #Import then use get_py2exe_datafiles() to collect numpy datafiles. 
matplotlib.use('wxagg') #Specify matplotlib backend. tkagg must still be included else error is thrown. 

data_files = [ 
      ("Stuff", glob(r'C:\ProjectFolder\Stuff\*.*')) 
      ,("dlls", glob(r'C:\ProjectFolder\dlls\*.dll')) 
      ,("pyds", glob(r'C:\ProjectFolder\pyds\*.pyd')) # py2exe specified pyd's 
      ] 
# Extend the tuple list because matplotlib returns a tuple list.  
data_files.extend(matplotlib.get_py2exe_datafiles()) #Matplotlib - pulls it's own files 

options = {'py2exe':{#'bundle_files': 1,         # Bundle files to exe 
         'includes': ["matplotlib.backends.backend_tkagg"] # Specifically include missing modules 
         ,'excludes': ['_gtkagg', 'tkagg']     # Exclude dependencies. Reduce size. 
         } 
      } 

setup(
name='ProjectName' 
,options = options 
,data_files=data_files 
,console=['projectname.py'] 
) 
9

Spróbuj użyć PyInstaller zamiast py2exe. Ma pełne wsparcie dla wxPython i matplotlib. I jest w fazie rozwoju, w przeciwieństwie do py2exe.

+0

I drugie zalecenie. PyInstaller działa doskonale dla wxPython i matplotlib, a także kilka innych nie wymienionych na ich liście [Supported Packages] (http://www.pyinstaller.org/wiki/SupportedPackages) takich jak [xlrd] (http://pypi.python.org/pypi/xlrd). Używałem PyInstaller i wszystkich 3 z tych pakietów przez ostatnie kilka tygodni w projekcie i było prawie bezboleśnie. – ChrisC

+0

@ChrisC Użyłem również [cx_freeze] (http://cx-freeze.sourceforge.net/), ponieważ PyInstaller 1.4 nie obsługiwał Pythona 2.6. Jestem trochę zaskoczony, że py2exe nadal jest używany tak często, ponieważ nie był aktualizowany od 2008 roku. – Velociraptors

+1

Szczerze mówiąc, nie widziałem dużej różnicy między py2exe i PyInstaller przez długi czas i właśnie domyślnie py2exe ...dopóki nie odkryłem, że PyInstaller obsłużył głupotę dystrybucji MSVCR * .DLL i mógł zawinąć matplotlib. Odtąd nie oglądałem się za siebie. – ChrisC

1
Dla prostego testu wystarczy skopiować folder "mpl-data" w "site-packages \ matplotlib" do folderu aplikacji. O ile mi wiadomo, "mpl-data" nie może być dołączona do pojedynczego pliku wykonywalnego, więc musi to być zawarte w twojej dystrybucji binarnej jako folder.

Użyłem py2exe za pośrednictwem GUI2Exe i mogłem zamrozić moją aplikację, która używa matplotlib + numpy/scipy + wx (tak oczywiście backend wxagg). Nie musiałem dołączać _tkagg (który jest jawnie wykluczony w domyślnym ustawieniu GUI2Exe, które działało dla mnie).

0

Dokumentacja Py2exe wyjaśnia źródło problemu i podaje rozwiązania. To zadziałało dla mnie. (Matplotlib wersję 1.1.0, Python 2,7)

http://www.py2exe.org/index.cgi/MatPlotLib

Ponieważ nie mam zaszczyt skomentować lub ocenić inne odpowiedzi, muszę napisać własny jeden. Odpowiedź Kirka była dla mnie najcenniejszą pomocą. PyInstaller może być obejściem (nie testowałem tego), ale zdecydowanie nie jest technicznym rozwiązaniem problemu!

from distutils.core import setup 
import py2exe 
from distutils.filelist import findall 
import os 
import matplotlib 
matplotlibdatadir = matplotlib.get_data_path() 
matplotlibdata = findall(matplotlibdatadir) 
matplotlibdata_files = [] 
for f in matplotlibdata: 
    dirname = os.path.join('matplotlibdata', f[len(matplotlibdatadir)+1:]) 
    matplotlibdata_files.append((os.path.split(dirname)[0], [f])) 


setup(
    console=['test.py'], 
    options={ 
      'py2exe': { 
         'includes': ["sip", "PyQt4.QtGui"], 
         'packages' : ['matplotlib', 'pytz'], 
         'excludes': ['_gtkagg', '_tkagg'] 
         } 
      }, 
    data_files=matplotlibdata_files 
)