использование py2exe с wxPython и Matplotlib - PullRequest
9 голосов
/ 27 июня 2011

Я пытаюсь сгенерировать файл .exe из скрипта python, использующего wxPython и Matplotlib, и это выглядит невозможным.

Импорт, который я делаю (связанный с Matplotlib), следующий:

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

Вот файл setup.py, который я пытаюсь использовать:

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
)

Я всегда получаю сообщение «Не удалось найти файлы данных matplotlib» после попытки запустить файл .exe, который, кстати, успешно создается.

Дополнительная информация: я использую Python 2.6, Matplotlib 0.99.3, wxPython 2.8.11.0 в Windows XP

Заранее спасибо. Любая помощь будет оценена!

Ура, Андресса Сиволелла

Ответы [ 4 ]

9 голосов
/ 23 августа 2011

Попробуйте использовать PyInstaller вместо py2exe.Он имеет полную поддержку wxPython и matplotlib.И он в активной разработке, в отличие от py2exe.

1 голос
/ 14 февраля 2012

Для простого теста вы можете просто скопировать папку 'mpl-data' в 'site-packages \ matplotlib' в папку вашего приложения.Насколько я знаю, 'mpl-data' нельзя объединить в один исполняемый файл, поэтому его нужно включить в бинарный дистрибутив в виде папки.

Я использовал py2exe через GUI2Exe и мог заморозить мое приложение, которое используетmatplotlib + numpy / scipy + wx (так что, очевидно, wxagg backend).Мне не нужно было включать _tkagg (который явно исключен в настройке по умолчанию GUI2Exe, которая работала для меня).

1 голос
/ 27 июля 2011

Существует множество проблем с matplotlib.get_py2exe_datafiles (), настолько удобных, насколько это было бы, если бы оно работало.Также неплохо указать, какой бэкэнд использовать.Вот рабочий импорт matplotlib, который я недавно использовал:

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']
)
0 голосов
/ 23 октября 2013

Документация Py2exe объясняет источник проблемы и дает решения. Это сработало для меня. (matplotlib версия 1.1.0, Python 2.7)

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

Поскольку я не имею права комментировать или оценивать другие ответы, я должен написать свой собственный. Ответ Кирка был самой ценной помощью для меня. PyInstaller может быть обходным путем (не проверял его), но определенно не является техническим решением проблемы!

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