[英]AttributeError with Scipy and Cython while converting Python to exe with cx_Freeze
我正在使用 cx_Freeze 將我的 python 腳本轉換為 exe 文件。 不幸的是,我在創建 exe 文件后執行它時出現AttributeError
:
AttributeError:類型對象“scipy.interpolate.interpnd.array”沒有屬性“__reduce_cython__”
使用的版本:Python:3.7.3 Scipy:1.2.1 Cython:0.29.7 cx_Freeze:5.1.1
我已經將所有使用的模塊升級到最新版本並搜索了錯誤。 我還嘗試再次卸載並重新安裝模塊。
我使用了以下 cx_Freeze setup.py
:
from cx_Freeze import setup, Executable
import os
# Set environment variables
# https://stackoverflow.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__'
正如@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 存儲庫上對相同的錯誤消息進行了相當廣泛的討論,請參閱問題 #1953 。 您可能會在那里找到進一步的建議。
根據此討論,該錯誤是由 Cython 中的一個問題引起的,該問題已在 Cython 0.28 中解決。 您還會在那里找到以下有用的評論:
[...] 如果您安裝的某個軟件包是使用有錯誤的舊 Cython 版本構建的,那么在您的系統上安裝 Cython 版本 xy 完全無關緊要。
我現在將關閉這張票,因為原因已用 0.28 修復。 如果您發現使用 0.28 或更高版本構建的軟件中出現類似問題,請開新票。
編輯:為了驗證 Cython 實現的包是用正確的(ed)Cython 版本構建的,解壓其源代碼分發(
*.tar.gz
來自 PyPI),在其中找到.c
或.cpp
文件並查看它們的第一行. 如果它顯示/* Generated by Cython 0.28 */
或更高版本,則它包含修復程序。 如果版本較舊,則不包含修復程序,在這種情況下,最好向項目索要新版本。
因此,您還需要檢查所有使用 Cython 構建並包含在您的可執行文件中的包是否都是使用 Cython 0.28 或更高版本構建的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.