AttributeError с Scipy и Cython при преобразовании Python в exe с помощью cx_Freeze - PullRequest
0 голосов
/ 14 мая 2019

Я конвертирую свой скрипт на python в exe-файл, используя cx_Freeze. К сожалению, я получаю AttributeError при выполнении exe-файла после его создания:

AttributeError: тип объекта «scipy.interpolate.interpnd.array» не имеет атрибут ' redu_cython '

Используемые версии: Python: 3.7.3 Сципи: 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__'

Спасибо за любой совет!

1 Ответ

0 голосов
/ 15 мая 2019
  1. Как прокомментировали @ead и @DavidW, опубликованное вами сообщение об ошибке указывает, что Scipy импортируется из установки Python 3.6 с учетом папки Python36 в пути

    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, чтобы увидеть, какие версии Python и Scipy фактически используются, когда cx_Freeze создает исполняемый файл.

  2. Существует довольно подробное обсуждение того же сообщения об ошибке в репозитории Cython github, см. Issue # 1953 . Вы можете найти дальнейший совет там.

    Согласно этому обсуждению, ошибка вызвана проблемой в Cython, которая была решена в Cython 0.28. Вы также найдете следующее полезное комментарий там:

    [...] просто установить версию Cython x.y в вашей системе совершенно не имеет значения, если установленный вами пакет был собран с более старой версией Cython, в которой есть ошибка.

    Я закрою этот билет сейчас, поскольку причина была исправлена ​​с 0,28. Пожалуйста, откройте новый тикет, если вы обнаружите аналогичную проблему, которая возникает в программном обеспечении, созданном с версией 0.28 или более поздней.

    Редактировать: чтобы убедиться, что реализованный пакет Cython был собран с правильной (ed) версией Cython, распакуйте его исходный дистрибутив (*.tar.gz из PyPI), найдите в нем файлы .c или .cpp и посмотрите на их первая строка. Если написано /* Generated by Cython 0.28 */ или более поздняя версия, оно включает исправление. Если версия более старая, в нее не входит исправление, и в этом случае лучше попросить проект о новой версии.

    Таким образом, вам также необходимо проверить, что все пакеты, созданные с помощью Cython и включенные в ваш исполняемый файл, были собраны с Cython 0.28 или более поздней версией.

...