简体   繁体   English

为什么在运行exe文件时cx_Freeze会出现此错误?

[英]Why does cx_Freeze rise this error when running an exe file?

I am a new user of cx_Freeze and I wanted to package my python file with all needed dependencies. 我是cx_Freeze的新用户,我想使用所有需要的依赖项打包python文件。

I use Python3 . 我使用Python3

I work under a python virtualenv with dependencies such as tensorflow, sklearn, matplotlib, python-vlc... 我在带有依赖项的python virtualenv下工作,例如tensorflow, sklearn, matplotlib, python-vlc...

Here are all files needed to reproduce the same error on Windows. 这是在Windows上重现相同错误所需的所有文件。

My requirements.txt to install 我的Requirements.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

I have one main python file IHM.py that imports modules from two others python files sync.py and neurnet.py . 我有一个主要的python文件IHM.py ,它从另外两个python文件sync.pyneurnet.py导入模块。

File ihm.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()

File sync.py 文件sync.py

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

File neurnet.py 文件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')

And here, the cx_Freeze setup.py : 在这里,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
)

Running this setup by using command : python setup.py build So it creates me an exe file but when I run this exe I got this error window : 通过使用命令运行此安装程序: python setup.py build因此它为我创建了一个exe文件,但是当我运行此exe时,出现此错误窗口:

Error cx_Freeze 错误cx_Freeze

And the trackback is the following : 引用如下:

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 really don't know how can I fix that.. 我真的不知道该如何解决。

I see the following potential problems in your setup script for cx_Freeze 5.1.1: 我在安装脚本中为cx_Freeze 5.1.1看到以下潜在问题:

  1. You are using numpy (and matplotlib which depends on numpy ). 您正在使用numpy (和matplotlib取决于numpy )。 In order that cx_Freeze correctly freezes numpy , it needs to be added to the packages list of the build_exe options. 为了使cx_Freeze正确冻结numpy ,需要将其添加到build_exe选项的packages列表中。

  2. For cx_Freeze version 5.1.1, the TCL/TK DLLs need to be included in a lib subdirectory of the build directory. 对于cx_Freeze版本5.1.1,需要在构建目录的lib子目录中包含TCL / TK DLL。 You can do that by passing a tuple (source, destination) to the corresponding entry of the include_files list option. 您可以通过将元组(source, destination)传递到include_files列表选项的相应条目来实现。 Furthermore, it would be safer to dynamically find out the location of the TCL/TK DLLs. 此外,动态找出TCL / TK DLL的位置会更安全。

Altogether, try with the following modifications in your setup script: 总之,请尝试在安装脚本中进行以下修改:

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'))]
)

If it still does not work with this modification, start from a minimal tkinter application, for example by commenting out all imports but tkinter in the example application you have posted and make it work on your system. 如果仍然不能与此修改工作,从最小启动tkinter应用,例如通过注释掉全部进口,但tkinter在您发布的示例应用程序,并使其在您的系统。 Re-add then the modules you need one by one ( numpy , matplotlib , ...) and check that the unfrozen and frozen applications work at each step. 然后,一个接一个地重新添加您需要的模块( numpymatplotlib ,...),并检查未冻结和冻结的应用程序在每个步骤中是否正常工作。 You can for example add a message box to the example application and print there the version of each module you import. 例如,您可以在示例应用程序中添加一个消息框,并在其中打印您导入的每个模块的版本。

I finally found a solution for the last traceback: 我终于找到了最后一次追溯的解决方案:

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

The problem is that distutils doesn't have many module that are not installed in the virtualenv. 问题是distutils没有在virtualenv中未安装的许多模块。 (only __init__.py ) So when we build the exe, it doesn't find the distutils modules... (仅__init__.py )因此,当我们构建exe时,它找不到distutils模块...

To fix that we have to manually import disutils 为了解决这个问题,我们必须手动导入disutils

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

And then, include this path to the include_files options of cx_freeze, and exclude distutils in the excludes section. 然后,将此路径包括到cx_freeze的include_files选项,并在excludes部分中排除distutils。

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']
)

I have also add pkg_resources._vendor in the packages because without this, cx_freeze raise an error like 我还在软件包中添加了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

Finally it work, I added numba to the package to includes because like for disutils, build doesn't create all required modules (for librosa). 终于可以正常工作了,我在包中添加了numba ,因为像disutils一样,build不会创建所有必需的模块(对于librosa)。

The last problem was about multiprocessing lib. 最后一个问题是关于multiprocessing库。 I have to manually rename Pool.pyc to pool.py c in the build lib folder. 我必须将Pool.pyc文件夹中的pool.py手动重命名为pool.py c。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM