首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么cx_Freeze在运行exe文件时会出现此错误?

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

Stack Overflow用户
提问于 2019-02-08 10:56:10
回答 2查看 2.9K关注 0票数 2

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

我使用Python3

我在python下使用依赖项(如tensorflow, sklearn, matplotlib, python-vlc... )。

以下是在Windows上复制相同错误所需的所有文件。

我要安装的requirements.txt

代码语言:javascript
复制
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.pyneurnet.py.导入模块。

文件ihm.py

代码语言:javascript
复制
# -*- 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

代码语言:javascript
复制
# -*- coding: utf-8 -*-
from __future__ import division
from neuralNet import 

文件neurnet.py

代码语言:javascript
复制
#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

代码语言:javascript
复制
# 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时,我得到了一个错误窗口:

冰冻

追踪器如下:

代码语言:javascript
复制
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'

我真的不知道该怎么解决..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-09 12:58:38

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

代码语言:javascript
复制
from distutils import dist, sysconfig # isort:skip 
ImportError: cannot import name "dist" 

问题是distutils没有很多没有安装在虚拟环境中的模块。(只有__init__.py)所以当我们构建exe时,它找不到distutils模块.

要解决这个问题,我们必须手动导入

代码语言:javascript
复制
import distutils
import opcode
import os
distutils_path = os.path.join(os.path.dirname(opcode.__file__), 'distutils')

然后,将该路径包含到include_files选项的cx_freeze,并将distutils排除在“排除”部分中。

代码语言:javascript
复制
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会引发一个错误,如

代码语言:javascript
复制
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一样,构建并不能创建所有必需的模块(对于librosa)。

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

票数 2
EN

Stack Overflow用户

发布于 2019-02-08 14:08:52

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

  1. 您正在使用numpy (以及依赖于numpymatplotlib )。为了使cx_Freeze正确冻结numpy,需要将其添加到build_exe选项的packages列表中。
  2. 对于cx_Freeze版本5.1.1,需要在构建目录的lib子目录中包含TCL/TCL。您可以通过将一个元组(source, destination)传递给include_files列表选项的相应条目来做到这一点。此外,动态查找TCL/TK的位置将更安全。

总之,在安装脚本中尝试进行以下修改:

代码语言:javascript
复制
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,.)并检查解冻和冻结的应用程序是否在每一步都能工作。例如,您可以向示例应用程序添加一个消息框,并在那里打印您导入的每个模块的版本。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54590916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档