2011-01-24 64 views
5

我想創建一個獨立的應用程序使用py2exe,這取決於matplotlib和numpy。應用程序的代碼是這樣的:bundle_files = 1失敗,py2exe使用matplotlib

import numpy as np 
import pylab as plt 

plt.figure() 
a = np.random.random((16,16)) 
plt.imshow(a,interpolation='nearest') 
plt.show() 

用於py2exe(從http://www.py2exe.org/index.cgi/MatPlotLib改性)的設置代碼是這樣的:

from distutils.core import setup 
import py2exe 
import sys 

sys.argv.append('py2exe') 

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

setup(console=[{"script" : "matplotlib_test.py"}], 
          zipfile=None,options=opts) 

現在,當bundle_files設定= 3或不存在,所有工作正常,但是生成的exe文件不能分發到沒有配置相同版本的Python等的機器上。如果我設置bundle_files = 1,它會創建一個合適的大型exe文件,它必須包含所有的東西,但它無法在本地運行或分佈式。在這種情況下,我使用Python 2.6.6在Windows 7計算機上創建了所有內容,並嘗試在安裝了Python 2.6.4的XP計算機上本地運行。

我在XP機器上運行時遇到的錯誤看起來很奇怪,因爲沒有捆綁,我在Win 7上沒有出現錯誤。通過捆綁,Win 7不報告追蹤信息,所以我不能確定錯誤是相同。在任何情況下,這裏的一對XP的錯誤消息:

Traceback (most recent call last): 
    File "matplotlib_test.py", line 2, in <module> 
    File "zipextimporter.pyc", line 82, in load_module 
    File "pylab.pyc", line 1, in <module> 
    File "zipextimporter.pyc", line 82, in load_module 
    File "matplotlib\__init__.pyc", line 709, in <module> 
    File "matplotlib\__init__.pyc", line 627, in rc_params 
    File "matplotlib\__init__.pyc", line 565, in matplotlib_fname 
    File "matplotlib\__init__.pyc", line 240, in wrapper 
    File "matplotlib\__init__.pyc", line 439, in _get_configdir 
RuntimeError: Failed to create C:\Documents and Settings\mnfienen/.matplotlib; c 
onsider setting MPLCONFIGDIR to a writable directory for matplotlib configuratio 
n data 

事先非常感謝,如果任何人都可以將解決這一問題的方向指向我!

編輯1:

我也跟着威廉的意見和固定MPLCONFIGDIR的問題,但現在得到一個新的錯誤:

:Traceback (most recent call last): 
    File "matplotlib\__init__.pyc", line 479, in _get_data_path 
RuntimeError: Could not find the matplotlib data files 

編輯2: 我用固定數據文件的問題:

data_files=matplotlib.get_py2exe_datafiles() 

這就導致了一個新的錯誤:

Traceback (most recent call last): 
    File "matplotlib_test.py", line 5, in <module> 
    import matplotlib.pyplot as plt 
    File "matplotlib\pyplot.pyc", line 78, in <module> 
    File "matplotlib\backends\__init__.pyc", line 25, in pylab_setup 
ImportError: No module named backend_wxagg 

回答

1

好Misha Fienen,我猜這似乎是無法寫入您可能已經知道的用戶文件夾。只是在黑暗中刺,但你有沒有嘗試過測試會發生什麼,如果你按照建議,並改變MPLCONFIGDIR到一些更基本的東西(如「C:\ matlibplotcfg \」)?

+0

感謝威廉。所以,我嘗試改變MPLCONFIGDIR,但它是一個紅鯡魚。事實證明,即使基礎測試.py代碼不會在未將MPLCONFIGDIR設置爲可寫位置的XP機器上運行,但現在我得到一個新的錯誤。請參閱上面原始問題中的編輯..... – mishaF 2011-01-25 03:01:53

2

我有同樣的問題。我認爲這個問題是由matplotlib中的pylab引起的,py2exe似乎無法找到並獲取所有與pylab相關的後端。

我通過改變我所有的嵌入圖來使用matplotlib.figure而不是pylab來解決問題。下面是關於如何使情節與matplotlib.figure一個簡單的例子:

import matplotlib.figure as fg 
import numpy as np 
fig = fg.Figure() 
ax = fig.add_subplot(111) 
lines = ax.plot(range(10), np.random.randn(10), range(10), np.random.randn(10)) 

你不能用這種直接使用fig.show(),但它可以嵌入圖形用戶界面。我用Tkinker:

canvas = FigureCanvasTkAgg(fig, canvas_master) 
canvas.show() 
0

有兩種解決問題的方法。

1.-在你matplotlib.rc文件使用:

backend : TkAgg

2:或者,在你的設置。PY 「包括」 鍵添加:

"matplotlib.backends.backend_wxagg"

兩種方式產生的測試圖在Python 2.6,Windows XP的