Почему cx_Freeze вызывает эту ошибку при запуске EXE-файла? - PullRequest
0 голосов
/ 08 февраля 2019

Я новый пользователь cx_Freeze, и я хотел упаковать свой файл python со всеми необходимыми зависимостями.

Я использую Python3 .

Я работаю под питономvirtualenv с зависимостями, такими как tensorflow, sklearn, matplotlib, python-vlc...

Вот все файлы, необходимые для воспроизведения той же ошибки в Windows.

My needs.txt для установки

absl-py==0.7.0
altgraph==0.16.1
astor==0.7.1
audioread==2.1.6
certifi==2018.11.29
chardet==3.0.4
cx-Freeze==5.1.1
cycler==0.10.0
decorator==4.3.2
distlib==0.2.8
future==0.17.1
gast==0.2.2
grpcio==1.18.0
h5py==2.9.0
idna==2.8
Jinja2==2.10
joblib==0.13.1
Keras-Applications==1.0.7
Keras-Preprocessing==1.0.9
kiwisolver==1.0.1
librosa==0.6.2
llvmlite==0.27.0
macholib==1.11
Markdown==3.0.1
MarkupSafe==1.1.0
matplotlib==3.0.2
numba==0.42.0
numpy==1.16.1
pefile==2018.8.8
protobuf==3.6.1
py2exe==0.9.2.2
PyInstaller==3.4
pynsist==2.3
pyparsing==2.3.1
pypiwin32==223
pysrt==1.1.1
python-dateutil==2.8.0
python-vlc==3.0.4106
pywin32==224
pywin32-ctypes==0.2.0
requests==2.21.0
requests-download==0.1.2
resampy==0.2.1
scikit-learn==0.20.2
scipy==1.2.0
six==1.12.0
sklearn==0.0
tensorboard==1.12.2
tensorflow==1.12.0
termcolor==1.1.0
tornado==5.1.1
urllib3==1.24.1
watson-developer-cloud==2.8.0
websocket-client==0.48.0
Werkzeug==0.14.1
yarg==0.1.9

У меня есть один основной файл Python IHM.py, который импортирует модули из двух других файлов Python sync.py и neurnet.py.

Файл ihm.py

# -*- coding: utf-8 -*-

# for Python3
from tkinter import *
import matplotlib.backends.backend_tkagg
import matplotlib.pyplot as mp
import tkinter.filedialog
from watson_developer_cloud import LanguageTranslatorV3
import json
import subprocess
import os
import vlc
from sync import *
import warnings

warnings.filterwarnings("ignore")

# Définition des variables globales
vid_file_path = ""
vid_srt_path = ""
vid_srt_path_trans = ""
vid_srt_path_sync = ""


# Création de la fenetre d'IHM
fenetre = Tk()
fenetre.title("Test Tkinter Windows")



fenetre.mainloop()

Файл sync.py

# -*- coding: utf-8 -*-
from __future__ import division
from neuralNet import 

Файл neurnet.py

#coding: utf-8
import os
import time
import sys
import librosa
import re
import io
import subprocess
import pysrt
import numpy as np
import matplotlib.pyplot as plt
from time import time
import tensorflow as tf
import pickle
#from sklearn.model_selection import train_test_split
#from tensorflow.contrib.layers import flatten
import sklearn



from subprocess import STDOUT

try:
    from subprocess import DEVNULL # py3k
except ImportError:
    import os
    DEVNULL = open(os.devnull, 'wb')

И вот, cx_Freeze setup.py :

# setup.py 
import sys, os
from cx_Freeze import setup, Executable

os.environ['TCL_LIBRARY'] = 'C:/Program Files/Python36/tcl/tcl8.6' 
os.environ['TK_LIBRARY'] = 'C:/Program Files/Python36/tcl/tk8.6'
__version__ = "1.1.0"

buildOptions = dict(
    packages = [],
    excludes = [],  includes = ["idna.idnadata"],
    include_files = ['C:/Program Files/Python36/DLLs/tcl86t.dll','C:/Program Files/Python36/DLLs/tk86t.dll'] )

import sys

base = 'Win32GUI' if sys.platform=='win32' else None 
executables = [
    Executable('ihm.py', base=base) 
] 
setup(
    name = "mgp320",
    description='Projet Neural Network Speech Detection',
    version=__version__,
    options = dict(build_exe = buildOptions),
    executables = executables
)

Запуск этой настройки с помощью команды: python setup.py build Так что это создает мне exeфайл, но когда я запускаю этот исполняемый файл, я получаю это окно ошибки:

Ошибка cx_Freeze

И трекбек следующий:

Traceback (most recent call last):
 File
"C:\Users\achraf.bentabib\Desktop\aapsa\aapsa\env\lib\site-p
ackages\cx_Freeze\initscript\__startup__.py", line 14, in run
  module.run()
 File
"C:\Users\achraf.bentabib\Desktop\aapsa\aapsa\env\lib\site-p
ackages\cx_Freeze\initscript\Console.py", line 26, in run
  exec(code, m.__dict__)
 File "ihm.py", line 5, in <module>
 File
"C:\Users\achraf.bentabib\Desktop\aapsa\aapsa\env\lib\site-p
ackages\matplotlib\__init__.py", line 120, in <module>
   import distutils.version
 File
"C:\Users\achraf.bentabib\Desktop\aapsa\aapsa\env\lib\distut
ils\__init__.py", line 35, in <module>
   loader.exec_module(real_distutils)
 File "<frozen importlib._bootstrap_external>", line 674, in
exec_module
 File "<frozen importlib._bootstrap_external>", line 780, in
get_code
 File "<frozen importlib._bootstrap_external>", line 832, in
get_data
FileNotFoundError: [Errno 2] No such file or directory:
"C:\\Users\\achraf.bentabib\\Desktop\\aapsa\\aapsa\\stack\\b
uild\\exe.win-amd64-3.6\\lib\\library.zip\\distutils\\__init__.py'

Iдействительно не знаю, как я могу это исправить ..

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Я наконец нашел решение для последней трассировки:

from distutils import dist, sysconfig # isort:skip 
ImportError: cannot import name "dist" 

Проблема в том, что distutils не имеет много модулей, которые не установлены в virtualenv.(только __init__.py) Поэтому, когда мы собираем exe-файл, он не находит модули distutils ...

Чтобы исправить это, мы должны вручную импортировать disutils

import distutils
import opcode
import os
distutils_path = os.path.join(os.path.dirname(opcode.__file__), 'distutils')

И затем, включите этот путь к опциям include_files cx_freeze и исключите distutils в разделе exclude.

buildOptions = dict(
    packages = ['llvmlite', 'pkg_resources._vendor', "tkinter", 'numba', "tkinter.filedialog", "audioread", "librosa", "scipy", "numpy"],
    excludes = ["scipy.spatial.cKDTree", 'distutils'],
    includes = ["idna.idnadata", 'numpy.core._methods', 'numpy.lib.format', 'matplotlib.backends.backend_tkagg'],
    include_files = [(distutils_path, 'distutils'), 'C:/Program Files/Python36/DLLs/tcl86t.dll','C:/Program Files/Python36/DLLs/tk86t.dll']
)

Я также добавил pkg_resources._vendor в пакеты, потому что без этого cx_freeze вызывает ошибку типа

ImportError: The 'appdirs' package is required; normally this is bundled with th
is package so if you get this warning, consult the packager of your distribution

Наконец, это работает, я добавил numba в пакет для включений, потому что, как и для disutils, build не создает все необходимые модули (для librosa).

Последняя проблема была о multiprocessing lib.Мне нужно вручную переименовать Pool.pyc в pool.py c в папке lib сборки.

0 голосов
/ 08 февраля 2019

Я вижу следующие потенциальные проблемы в вашем скрипте установки для cx_Freeze 5.1.1:

  1. Вы используете numpymatplotlib, что зависит от numpy).Чтобы cx_Freeze правильно зависает numpy, его необходимо добавить в список packages параметров build_exe.

  2. Для cx_Freeze версия 5.1.1библиотеки DLL TCL / TK должны быть включены в подкаталог lib каталога сборки.Вы можете сделать это, передав кортеж (source, destination) соответствующей записи опции списка include_files.Кроме того, было бы безопаснее динамически определять местоположение DLL-файлов TCL / TK.

В целом попробуйте внести следующие изменения в сценарий установки:

PYTHON_INSTALL_DIR = os.path.dirname(sys.executable)
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')

buildOptions = dict(
    packages = ["numpy"],
    excludes = [],
    includes = ["idna.idnadata"],
    include_files=[(os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'),
                    os.path.join('lib', 'tk86t.dll')),
                   (os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'),
                    os.path.join('lib', 'tcl86t.dll'))]
)

Если с этой модификацией она все еще не работает, начните с минимального tkinter приложения, например, закомментировав все операции импорта, кроме tkinter в примере приложения, которое вы опубликовали, и сделайте так, чтобы оно работало в вашей системе.Затем добавьте поочередно нужные вам модули (numpy, matplotlib, ...) и проверьте, работают ли замороженные и замороженные приложения на каждом шаге.Например, вы можете добавить окно сообщения в пример приложения и распечатать там версию каждого импортируемого вами модуля.

...