2013-09-03 94 views
11

tôi không thể tìm ra cách để có thể gói này qua py2exe bây giờ:ImportError: Không có mô-đun tên mpl_toolkits với maptlotlib 1.3.0 và py2exe

Tôi đang chạy lệnh:

python setup2.py py2exe 

qua python 2.7.5 và matplotlib 1.3.0 và 0.6.9 py2exe và 0.6.10dev

này đã làm việc với matplotlib 1.2.x

tôi đã đọc http://www.py2exe.org/index.cgi/ExeWithEggs và cố gắng thực hiện các các đề xuất để xử lý mpl_toolkits vì nó đã trở thành một gói không gian tên.

Tôi đang cố gắng để có được một câu trả lời ở đây quá: http://matplotlib.1069221.n5.nabble.com/1-3-0-and-py2exe-regression-td41723.html

Thêm một sản phẩm nào __init__.py để mpl_toolkits làm cho nó hoạt động, nhưng đây chỉ là một cách giải quyết cho vấn đề.

bất cứ ai có thể đề xuất những gì tôi cần phải làm cho công việc py2exe với mpl_toolkits.axes_grid1 trong matplotlib 1.3.0:


test_mpl.py là:

from mpl_toolkits.axes_grid1 import make_axes_locatable, axes_size 

if __name__ == '__main__': 
    print make_axes_locatable, axes_size 

setup2 .py là:

import py2exe 
import distutils.sysconfig 
from distutils.core import setup 

# attempts to get it to work 
import modulefinder 
import matplotlib 
import mpl_toolkits.axes_grid1 
__import__('pkg_resources').declare_namespace("mpl_toolkits") 
__import__('pkg_resources').declare_namespace("mpl_toolkits.axes_grid1") 
modulefinder.AddPackagePath("mpl_toolkits", matplotlib.__path__[0]) 
modulefinder.AddPackagePath("mpl_toolkits.axes_grid1", mpl_toolkits.axes_grid1.__path__[0]) 

# end of attempts to get it to work 

options={'py2exe': {'packages' : ['matplotlib', 'mpl_toolkits.axes_grid1', 'pylab', 'zmq'], 
        'includes': ['zmq', 'six'], 
        'excludes': ['_gdk', '_gtk', '_gtkagg', '_tkagg', 'PyQt4.uic.port_v3', 'Tkconstants', 'Tkinter', 'tcl'], 
        'dll_excludes': ['libgdk-win32-2.0-0.dll', 
            'libgdk_pixbuf-2.0-0.dll', 
            'libgobject-2.0-0.dll', 
            'tcl85.dll', 
            'tk85.dll'], 
        'skip_archive': True },} 

setup(console=['test_mpl.py'], options=options) 

đầu ra là:

running py2exe 
*** searching for required modules *** 
Traceback (most recent call last): 
    File "setup2.py", line 23, in <module> 
    setup(console=['test_mpl.py'], options=options) 
    File "C:\Python27\lib\distutils\core.py", line 152, in setup 
    dist.run_commands() 
    File "C:\Python27\lib\distutils\dist.py", line 953, in run_commands 
    self.run_command(cmd) 
    File "C:\Python27\lib\distutils\dist.py", line 972, in run_command 
    cmd_obj.run() 
    File "C:\Python27\lib\site-packages\py2exe\build_exe.py", line 243, in run 
    self._run() 
    File "C:\Python27\lib\site-packages\py2exe\build_exe.py", line 296, in _run 
    self.find_needed_modules(mf, required_files, required_modules) 
    File "C:\Python27\lib\site-packages\py2exe\build_exe.py", line 1308, in find_needed_modules 
    mf.import_hook(f) 
    File "C:\Python27\lib\site-packages\py2exe\mf.py", line 719, in import_hook 
    return Base.import_hook(self,name,caller,fromlist,level) 
    File "C:\Python27\lib\site-packages\py2exe\mf.py", line 136, in import_hook 
    q, tail = self.find_head_package(parent, name) 
    File "C:\Python27\lib\site-packages\py2exe\mf.py", line 204, in find_head_package 
    raise ImportError, "No module named " + qname 
ImportError: No module named mpl_toolkits 
+0

bạn nên sử dụng pyinstaller, tốt nhất là có –

+0

Chúng tôi dự định chuyển sang cx_freeze cho rằng không giống như pyinstaller, nó tương thích py3k, nhưng py2exe là đương nhiệm trong không gian này – RuiDC

+0

pyinstaller có cùng lỗi, cx_Freeze không may có vấn đề với một số thủ thuật trong 1.7.x. – RuiDC

Trả lời

3

Hầu hết các thư mục trong thư mục trang web gói trong một cài đặt Python là gói (họ có một tập tin __init__.py). Nếu không có tệp __init__.py, thì gói được gọi là gói không gian tên . cx_Freeze có một tùy chọn để chỉ ra rằng mpl_toolkits là một gói không gian tên, vì vậy các gói phụ có thể được tìm thấy.

+0

cảm ơn, đó đã là tuyến đường ưa thích của tôi, nhưng như tôi đã đề cập trong các ý kiến ​​của tôi, cx_Freeze gặp vấn đề với numpy thay thế. – RuiDC

+0

Ah, tôi quên bạn đã viết điều đó. Tôi quay lại câu hỏi này sau vài ngày và không đọc chi tiết một lần nữa. Chúc may mắn! –

15

Có một giải pháp khá đơn giản cho vấn đề này. Tìm thư mục mà từ đó mpl_tools được nhập và chỉ cần thêm một tệp văn bản trống có tên __init__.py vào thư mục đó. py2exe bây giờ sẽ tìm và bao gồm mô-đun này mà không cần bất kỳ nhập khẩu đặc biệt nào cần thiết trong tệp thiết lập.

Bạn có thể tìm thấy thư mục mpl_tools bằng cách gõ như sau trong một con trăn console:

import importlib 
importlib.import_module('mpl_toolkits').__path__ 

tôi tìm thấy giải pháp ở đây https://stackoverflow.com/a/11632115/2166823 và có vẻ như để áp dụng cho các gói namespace nói chung.

+0

tôi đã thêm rằng trong câu hỏi ban đầu của tôi: "Thêm một __init__.py trống để mpl_toolkits làm cho nó hoạt động, nhưng đây chỉ là một giải pháp cho vấn đề." – RuiDC

+0

Tệ của tôi, tôi đã đọc câu hỏi của bạn tại diễn đàn danh sách gửi email matplotlib và sau đó đăng cách giải quyết trên đó và tại đây. Không nhận thấy rằng bạn đã thêm dòng đó vào đây. –

+0

Bây giờ câu hỏi thực sự là lý do tại sao '__init __. Py' bị bỏ đi ngay từ đầu. Tất cả những gì tôi đã có cho đến nay là "một cái gì đó một cái gì đó không gian tên gói". – tel

5

Sự cố này xảy ra với tôi sau khi tôi cập nhật MacOS lên Sierra từ El Capitan.

sudo pip install -U matplotlib 

giải quyết được sự cố của tôi.

Trang này https://github.com/JuliaPy/PyPlot.jl/issues/294 cũng có thể giúp bạn.