использование py2exe с wxPython и Matplotlib

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

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

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

Вот файл 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.

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

С уважением, Андресса Сиволелла


person asivolella    schedule 27.06.2011    source источник


Ответы (4)


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

person Velociraptors    schedule 23.08.2011
comment
Я поддерживаю эту рекомендацию. PyInstaller прекрасно работает с wxPython и matplotlib, а также с несколькими другими, не упомянутыми в их списке поддерживаемых пакетов, например xlrd. Я использовал PyInstaller и все 3 этих пакета в течение последних нескольких недель в проекте, и это было почти безболезненно. - person ChrisC; 24.08.2011
comment
@ChrisC Я также использовал cx_freeze, так как PyInstaller 1.4 не поддерживал Python 2.6. Я немного удивлен, что py2exe продолжает так часто использоваться, поскольку он не обновлялся с 2008 года. - person Velociraptors; 24.08.2011
comment
Честно говоря, я долгое время не видел большой разницы между py2exe и PyInstaller и просто использовал по умолчанию py2exe... пока не обнаружил, что PyInstaller справляется с глупостью дистрибутива MSVCR*.DLL и может обернуть matplotlib. С тех пор не оглядывался назад. - person ChrisC; 24.08.2011
comment
Вы определенно можете доставить пакет с matplotlib, используя py2exe; см. ответ оттерба. - person Chelonian; 21.02.2012
comment
pyinstaller намного лучше, чем py2exe! Спасибо за подсказку! - person Nicholas; 03.08.2014

Есть ряд проблем с 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']
)
person Kirk    schedule 26.07.2011
comment
Большое спасибо. Я знаю, что этот ответ очень старый, но я думал, что никогда не смогу успешно преобразовать свою программу в исполняемый файл. Я знаю, что СПАСИБО технически недопустимый комментарий, но это действительно действительно очень помогло мне. - person mauve; 29.08.2018

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

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

person otterb    schedule 14.02.2012

Документация 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
)
person Rv F    schedule 23.10.2013