简体   繁体   中英

Matplotlib in py2exe — ImportError: cannot import name dist (File “distutils\__init__.pyc”)

Matplotlib working in this app perfectly.. but not working in build for some reason. Why?

I'll gladly take any advice that can help me.

.exe.log :

Traceback (most recent call last):
  File "main.py", line 3, in <module>
  File "zipextimporter.pyc", line 82, in load_module
  File "matplotlib\__init__.pyc", line 103, in <module>
  File "zipextimporter.pyc", line 82, in load_module
  File "distutils\__init__.pyc", line 25, in <module>
ImportError: cannot import name dist

main.py is a script that I'm building. line #3 of it:

import matplotlib

build.py :

# encoding: utf-8

import os
import sys
import errno

sys.path.append(os.path.abspath("."))

from distutils.core import setup
import shutil
import py2exe
import matplotlib as mpl

mpl.use('Agg')

distDir = 'dist'
shutil.rmtree('build', ignore_errors=True)
shutil.rmtree(distDir, ignore_errors=True)

try:
    os.makedirs(distDir)
except OSError as exc:
    if exc.errno == errno.EEXIST and os.path.isdir(distDir):
        pass
    else:
        raise

icon = 'icon.ico'

includes = ['matplotlib', 'numpy']
packages = ['matplotlib', 'pytz']
excludes = [
    '_gtkagg', '_tkagg', 'bsddb', 'curses', 'email',
    'pywin.debugger', 'pywin.debugger.dbgcon', 'pywin.dialogs',
    'tcl', 'Tkconstants', 'Tkinter', 'sqlite3', 'doctest', 'test'
]
dll_excludes = [
    'libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll', 'libgdk_pixbuf-2.0-0.dll',
    'tcl84.dll', 'tk84.dll', 'w9xpopen.exe'
]
data_files = mpl.get_py2exe_datafiles()


class Target(object):
    def __init__(self, **kw):
        self.__dict__.update(kw)


icon_resources = [(0, icon)]
GUI2Exe_Target = Target(
    script='main.py',
    dest_base='app_name',
    name='app_name',
    company_name='company_name',
    copyright='company_name',
    version='0.0.1',
    icon_resources=icon_resources,
    bitmap_resources=[],
    other_resources=[]
)

setup(
    options={
        "py2exe": {
            "compressed": 1,
            "optimize": 0,
            "includes": includes,
            "excludes": excludes,
            "packages": packages,
            "dll_excludes": dll_excludes,
            "bundle_files": 1,
            "dist_dir": distDir,
            "skip_archive": False,
            "xref": False,
            "ascii": False,
            "custom_boot_script": '',
        }
    },
    zipfile=None,
    data_files=data_files,
    console=[],
    windows=[GUI2Exe_Target],
    service=[],
    com_server=[],
    ctypes_com_server=[]
)

pip freeze :

..
matplotlib==1.3.1
numpy==1.8.2
..

python --version :

Python 2.7.6

Okay, I did not find proper solution for this problem.

I solved it with dirty hack , by simply replacing distutils dir in venv by distutils dir of system python. Now it all working and it working in venv! Don't quite sure about drawbacks of that though .

The issue as I can understand it, is that distutils of venv is really weird thing. Seems like venvwrapper or/and python packages changed it for some reasons, I don't know.

If you know something about this situation, please go ahead and add it to the thread as answers or comments. :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM