使用 cx_Freeze 将 Python 转换为 exe 时 Scipy 和 Cython 出现 AttributeError
Posted
技术标签:
【中文标题】使用 cx_Freeze 将 Python 转换为 exe 时 Scipy 和 Cython 出现 AttributeError【英文标题】:AttributeError with Scipy and Cython while converting Python to exe with cx_Freeze 【发布时间】:2019-05-14 16:17:52 【问题描述】:我正在使用 cx_Freeze 将我的 python 脚本转换为 exe 文件。
不幸的是,我在创建它后执行 exe 文件时得到一个AttributeError
:
AttributeError: type object 'scipy.interpolate.interpnd.array' 没有 属性'__reduce_cython__'
使用过的版本: 蟒蛇:3.7.3 西皮:1.2.1 赛通:0.29.7 cx_Freeze:5.1.1
我已经将所有使用的模块升级到最新版本并搜索错误。我还尝试再次卸载并重新安装模块。
我使用了以下cx_Freeze setup.py
:
from cx_Freeze import setup, Executable
import os
# Set environment variables
# https://***.com/questions/35533803/keyerror-tcl-library-when-i-use-cx-freeze
os.environ['TCL_LIBRARY'] = r'C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\tcl\tk8.6'
includes = ["numpy", "numpy.core._methods", "numpy.lib.format", "sklearn", "ipaddress", "schwifty", "pandas", "multiprocessing.pool", "pkg_resources._vendor", "appdirs", "sklearn.ensemble.forest", "packaging.version", "packaging.specifiers", "packaging.requirements", "xgboost", "email.mime.text", "email.mime.multipart", "idna.idnadata", 'scipy._distributor_init', 'scipy.sparse.csgraph._validation', "cython", "scipy.interpolate.interpnd", "scipy"]
setup(name = "fraudDetection",
version = "0.1",
description = "",
options = 'build_exe': 'includes': includes,
executables = [Executable("fraudDetection.py")]
)
我希望 exe 文件能够运行并给出预测(欺诈检测),但我收到此错误消息(每次启动 exe 文件时):
编辑:更新错误文件
File "C:\Program Files (x86)\Microsoft Visual
Studio\Shared\Anaconda3_64\lib\site-packages\cx_Freeze\initscripts\__startup__.py", line 14, in run
module.run()
File "C:\Program Files (x86)\Microsoft Visual
Studio\Shared\Anaconda3_64\lib\site-packages\cx_Freeze\initscripts\Console.py", line 26, in run
exec(code, m.__dict__)
File "fraudDetection.py", line 40, in <module>
from sklearn import preprocessing
File "C:\Program Files (x86)\Microsoft Visual
Studio\Shared\Anaconda3_64\lib\site-packages\sklearn\preprocessing\__init__.py", line 6, in <module>
from ._function_transformer import FunctionTransformer
File "C:\Program Files (x86)\Microsoft Visual
Studio\Shared\Anaconda3_64\lib\site-packages\sklearn\preprocessing\_function_transformer.py", line 5, in <module>
from ..utils.testing import assert_allclose_dense_sparse
File "C:\Program Files (x86)\Microsoft Visual
Studio\Shared\Anaconda3_64\lib\site-packages\sklearn\utils\testing.py", line 21, in <module>
import scipy.io
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\scipy\io\__init__.py",
line 97, in <module>
from .matlab import loadmat, savemat, whosmat, byteordercodes
File "C:\Program Files (x86)\Microsoft Visual
Studio\Shared\Anaconda3_64\lib\site-packages\scipy\io\matlab\__init__.py", line 13, in <module>
from .mio import loadmat, savemat, whosmat
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\scipy\io\matlab\mio.py",
line 10, in <module>
from .miobase import get_matfile_version, docfiller
File "C:\Program Files (x86)\Microsoft Visual
Studio\Shared\Anaconda3_64\lib\site-packages\scipy\io\matlab\miobase.py", line 22, in <module>
from scipy.misc import doccer
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\scipy\misc\__init__.py",
line 68, in <module>
from scipy.interpolate._pade import pade as _pade
File "C:\Program Files (x86)\Microsoft Visual
Studio\Shared\Anaconda3_64\lib\site-packages\scipy\interpolate\__init__.py", line 175, in <module>
from .interpolate import *
File "C:\Program Files (x86)\Microsoft Visual
Studio\Shared\Anaconda3_64\lib\site-packages\scipy\interpolate\interpolate.py", line 32, in <module>
from .interpnd import _ndim_coords_from_arrays
File "stringsource", line 105, in init scipy.interpolate.interpnd
AttributeError: type object 'scipy.interpolate.interpnd.array' has no attribute '__reduce_cython__'
【问题讨论】:
您说您使用 Python3.7,但在您的回溯中,我看到 Python3.6 的库/来自 Python3.6 的库 - 这可能会起作用。除此之外,您应该提交错误报告(SO 不是最好的地方)。 @ead 当然,你是对的,我在更新 python 和模块之前使用了旧的输出文件。我现在将错误更新为新版本(见上文)。 @chris 您唯一做的就是添加“编辑:更新了错误文件”。报错信息一模一样,依然在...中显示带有“Python36”的路径 显然你是对的,一定是在编辑时多次按下 cmd+z。对不起! 【参考方案1】:正如@ead 和@DavidW 评论的那样,您发布的错误消息表明,鉴于路径中的Python36
文件夹,Scipy 是从 Python 3.6 安装中导入的
File "C:\Users\user.name\AppData\Roaming\Python\Python36\site-packages\scipy\interpolate\interpolate.py"
但也许您只是忘记编辑这部分错误消息。
无论如何,您可以添加以下几行
import sys
import scipy
print(sys.version)
print(scipy.__version__)
到您的setup.py
文件,以查看在 cx_Freeze 构建可执行文件时实际使用的 Python 和 Scipy 版本。
在 Cython github 存储库上对相同的错误消息进行了相当广泛的讨论,请参阅 Issue #1953。您可能会在那里找到更多建议。
根据这个讨论,该错误是由 Cython 中的一个问题引起的,该问题已在 Cython 0.28 中解决。您还可以在那里找到以下有用的comment:
[...] 如果您安装的某个软件包是使用具有错误的旧 Cython 版本构建的,那么仅在您的系统上安装 Cython 版本 x.y 完全无关紧要。
我现在将关闭这张票,因为原因已用 0.28 修复。如果您发现使用 0.28 或更高版本构建的软件中出现类似问题,请开新票。
编辑:要验证 Cython 实现的包是用正确的(ed)Cython 版本构建的,解压缩其源代码分发(来自 PyPI 的
*.tar.gz
),在其中找到.c
或.cpp
文件并查看他们的第一行。如果它显示/* Generated by Cython 0.28 */
或更高版本,则包含修复。如果版本较旧,则不包含修复程序,在这种情况下,最好要求项目提供新版本。
因此,您还需要检查所有使用 Cython 构建并包含在您的可执行文件中的包是否都是使用 Cython 0.28 或更高版本构建的。
【讨论】:
以上是关于使用 cx_Freeze 将 Python 转换为 exe 时 Scipy 和 Cython 出现 AttributeError的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 cx_freeze 将 python 文件转换为可执行文件时出错
将 python 文件转换为可执行文件时,出现“没有名为 cx_freeze.util 的模块”错误
使用 cx_freeze 将脚本转换为 .exe 时如何包含 tkinter?