使用 matplotlib 时来自 cx-freeze 的运行时错误

Posted

技术标签:

【中文标题】使用 matplotlib 时来自 cx-freeze 的运行时错误【英文标题】:error at run time from cx-freeze when use matplotlib 【发布时间】:2018-06-29 17:34:52 【问题描述】:

我开始使用 cx-freeze,源文件仅包含 print("hello from cx-freeze")。效果很好。

然后,我尝试了https://gist.github.com/joferkington/9214844 我收到了错误消息。我将源文件更改为非常简单。我仍然收到 TCL_LIBRARY 错误。我听从了KeyError: 'TCL_Library' when I use cx_Freeze (Martin Tournoij) 的建议

错误消失了。创建 exe 文件(如 500+ mb)。当我运行文件时,我收到错误消息。

我检查其他人的问题 Creating exe file with cx_Freeze, PyQt4, matplotlib and multiple .py files does not work (那里没有提供答案)

其他问题,如cx_Freeze help. ImportError

cx-freeze fails to include modules even when included specifically 或者 cx-freeze doesn't find all dependencies

我检查了它们,但似乎不适用于我的情况(至少我不知道如何使它与我正在做的事情一起工作,如果你能解释一下,谢谢)

这个很像 ImportError: No module named 'queue' while running my app freezed with cx_freeze 但解决方案是导入多处理(我也尝试过它也不起作用)

我尝试了 setup.py 的完整选项

from cx_Freeze import setup, Executable
import sys
import os.path
PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))
os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tcl8.6')
os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tk8.6')

base = 'Console'

options = 
    'build_exe': 'packages': ["pandas","numpy","scipy","matplotlib"],
        'include_files':[
            os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'),
            os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'),
            os.path.join(PYTHON_INSTALL_DIR, 'Library', 'plugins', 'platforms')
         ],
    ,


executables = [
    Executable('plot2.py', base = base)
]

setup(name = "plot2" ,
      version = "0.1" ,
      description = "" ,
      executables = executables,
      options = options
      )

我也尝试了更少的选项

from cx_Freeze import setup, Executable
import sys
import os.path
PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))
os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tcl8.6')
os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tk8.6')

base = 'Console'

options = 
    'build_exe': 'packages': ["matplotlib"],
        'include_files':[
            os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'),
            os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll')]
    


executables = [
    Executable('plot2.py', base = base)
]

setup(name = "plot2" ,
      version = "0.1" ,
      description = "" ,
      executables = executables,
      options = options
      )

两者都很好。我什至在我的目标文件夹中有tcl86t.dlltk86t.dll。 然而,当我尝试运行它时,两者都失败了。带有“less option”的设置会给出以下错误消息

Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\cx_Freeze\initscripts\__start
up__.py", line 14, in run
    module.run()
  File "C:\ProgramData\Anaconda3\lib\site-packages\cx_Freeze\initscripts\Console
.py", line 26, in run
    exec(code, m.__dict__)
  File "plot2.py", line 1, in <module>
  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\__init__.py", line
 127, in <module>
    from . import cbook
  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\cbook\__init__.py"
, line 35, in <module>
    import numpy as np
  File "C:\ProgramData\Anaconda3\lib\site-packages\numpy\__init__.py", line 158,
 in <module>
    from . import add_newdocs
  File "C:\ProgramData\Anaconda3\lib\site-packages\numpy\add_newdocs.py", line 1
3, in <module>
    from numpy.lib import add_newdoc
  File "C:\ProgramData\Anaconda3\lib\site-packages\numpy\lib\__init__.py", line
8, in <module>
    from .type_check import *
  File "C:\ProgramData\Anaconda3\lib\site-packages\numpy\lib\type_check.py", lin
e 11, in <module>
    import numpy.core.numeric as _nx
  File "C:\ProgramData\Anaconda3\lib\site-packages\numpy\core\__init__.py", line
 38, in <module>
    from . import numeric
  File "C:\ProgramData\Anaconda3\lib\site-packages\numpy\core\numeric.py", line
2896, in <module>
    from . import fromnumeric
  File "C:\ProgramData\Anaconda3\lib\site-packages\numpy\core\fromnumeric.py", l
ine 15, in <module>
    from . import _methods
ImportError: cannot import name '_methods'

即使是https://github.com/anthony-tuininga/cx_Freeze/blob/master/cx_Freeze/samples/matplotlib/setup.py

base = 'Console'
if sys.platform == 'win32':
    base = 'Win32GUI'

它仍然不工作(python setup.py build 工作,但是当我双击 .exe 文件时程序不运行)。

我的 plot2.py 代码只是简化为创建 jpg 文件(它在我刚刚 python plot2.py 时运行)

import matplotlib.pyplot as plt
x = [1,2,3,4,5.5]
y = [3,4,5,6,7.7]
plt.figure()
plt.plot(x,y,'o')
plt.savefig("test.jpg",dpi = 200)

我通过 anaconda 安装 python。 python --version给了

Python 3.6.5 :: Anaconda, Inc.

结果。 conda list 表明我的cx-Freeze 版本是5.1.1

if sys.platform == 'win32':
    base = 'Win32GUI'

并在包列表中添加多处理器它不起作用(我认为它不相关但看到其他人做了(在其他应用程序上)并且它起作用了所以我尝试了,可能是错误的)。我能做的最好的就是在运行时得到这个错误(下图)。

error report when click on the exe file

有没有办法解决这个问题?我在 ubuntu 系统上也有 python,但还没有尝试。如果有帮助,我可以卸载 python 或使用其他版本的 python/cx-Freeze。如果我需要安装其他版本的python/cx-Freeze,也请告诉我怎么做。

这里的另一个问题是,有没有办法使 exe 文件更小。只是创建一个图表不应该是 500+ mb 的程序。也许我包括应该排除的包/文件。请帮忙。谢谢。

【问题讨论】:

【参考方案1】:

我遇到了这个问题,起作用的是我使用了“pyinstaller”而不是“cx_freeze”,然后在构建 exe 文件后,我从“c:\Users\\envs\environmentname>\ Library\plugins\platforms”到主 .exe 文件所在的位置。

【讨论】:

以上是关于使用 matplotlib 时来自 cx-freeze 的运行时错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 MatplotLib 可视化来自 SKlearn Kmeans 的稀疏输入

matplotlib - 来自矩形高度阵列的 3d 表面

使用来自main和衍生过程的matplotlib

Matplotlib/Genfromtxt:针对时间的多个图,跳过丢失的数据点,来自 .csv

来自颜色字典的 matplotlib.pyplot 散点图图例

使用 matplotlib 在一个子图中绘制来自 pandas DataFrame 的两个直方图