使用 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.dll
和tk86t.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/Genfromtxt:针对时间的多个图,跳过丢失的数据点,来自 .csv