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

时间:2019-02-08 10:56:10

标签: python cx-freeze distutils

我是cx_Freeze的新用户,我想用所有需要的依赖项打包python文件。

我使用 Python3

我在python virtualenv下工作,其依赖项为tensorflow, sklearn, matplotlib, python-vlc...

这里是在Windows上重现相同错误所需的所有文件。

我的 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

我有一个主要的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文件,但是当我运行该exe时,出现此错误窗口:

Error 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'

我真的不知道该如何解决。.

2 个答案:

答案 0 :(得分:2)

我在您的cx_Freeze 5.1.1的安装脚本中看到以下潜在问题:

  1. 您正在使用numpy(和matplotlib取决于numpy)。为了使cx_Freeze正确冻结numpy,需要将其添加到packages选项的build_exe列表中。

  2. 对于cx_Freeze版本5.1.1,TCL / TK DLL必须包含在构建目录的lib子目录中。您可以通过将元组(source, destination)传递到include_files列表选项的相应条目来实现。此外,动态找出TCL / TK DLL的位置会更安全。

一起,尝试在设置脚本中进行以下修改:

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以外的所有导入,并使其在您的示例中运行系统。然后,一个接一个地重新添加您需要的模块(numpymatplotlib,...),并检查未冻结和冻结的应用程序在每个步骤中是否正常工作。例如,您可以在示例应用程序中添加一个消息框,并在其中打印您导入的每个模块的版本。

答案 1 :(得分:1)

我终于找到了最后一次追溯的解决方案:

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

问题是distutils没有在virtualenv中安装的模块很多。 (只有1个}}) 因此,当我们构建exe时,它没有找到distutils模块...

要解决此问题,我们必须手动导入disutils

__init__.py

然后,将此路径包括到cx_freeze的include_files选项中,并 在排除部分中排除distutils。

import distutils
import opcode
import os
distutils_path = os.path.join(os.path.dirname(opcode.__file__), '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'] ) ,因为如果没有这个,cx_freeze会引发类似

的错误
pkg_resources._vendor

最后它成功了,我在包中添加了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 ,因为与disutils一样,build并不会创建所有必需的模块(对于librosa)。

最后一个问题是关于numba lib。 我必须将build lib文件夹中的multiprocessing手动重命名为Pool.pyc c。

相关问题