将 tkinter 脚本转换为 .exe 文件后,尝试执行时出现错误:ModuleNotFoundError: No module named 'numpy'

Posted

技术标签:

【中文标题】将 tkinter 脚本转换为 .exe 文件后,尝试执行时出现错误:ModuleNotFoundError: No module named \'numpy\'【英文标题】:After converting tkinter script into .exe-file, when try executing, there is error: ModuleNotFoundError: No module named 'numpy'将 tkinter 脚本转换为 .exe 文件后,尝试执行时出现错误:ModuleNotFoundError: No module named 'numpy' 【发布时间】:2020-12-21 18:10:44 【问题描述】:

我在 Jupyter 笔记本中编写了一个 python3 脚本(名称为“SVD.ipynb”):

from tkinter import *
from PIL import Image, ImageTk

import numpy as np
from scipy import linalg as lg
import matplotlib.pyplot as plt



########## Funktion zur Erstellung von Bilddateien in unterschiedlichen #####
########## Kompressionsstufen werden erzeugt #################################

def svd():
    filepath = "SVD_F.txt"
    reader = open(filepath,"r")
    text = reader.readlines()
    outer_array = []
    current_array =[]
    for line in text:
        for char in line:
            if char=='0' or char=='1':
                current_array.append((-1)*float(char))
        outer_array.append(current_array)
        current_array=[]

    F = outer_array

    #plt.imshow(F, cmap="gray") 
    #plt.show()
    plt.imsave('SVD_F.png', F, cmap="gray")

    U, s, Vh = lg.svd(F)

    s_matrix = np.zeros((25,15))
    for i in range(0, len(s)):
        s_matrix[i][i] = s[i]


    for i in range(1, 4):
        F_approx = U[:,:i] @ s_matrix[:i,:i] @ Vh[:i,:]
        #plt.imshow(F_approx, cmap="gray")        
        #x=plt.show()
        plt.imsave('SVD_F_approx'+str(i)+'.png', F_approx, cmap="gray")
        


########## Haupt-Benutzerfenster wird erzeugt ######################################
        
root = Tk()
root.title('SVD')


######### Obige Funktion wird aufgerufen ###########################################

svd()

######### Bilder werden ins Hauptfenster geladen, vergroessert dargestellt #########
################## und entsprechend angeordnet #####################################

image = Image.open("SVD_F.png")
image = image.resize((100, 100), Image.ANTIALIAS)
my_img0 = ImageTk.PhotoImage(image)
image_label0 = Label(image=my_img0)
image_label0.grid(row=0,column=1)

image = Image.open("SVD_F_approx1.png")
image = image.resize((100, 100), Image.ANTIALIAS)
my_img1 = ImageTk.PhotoImage(image)
image_label1 = Label(image=my_img1)
image_label1.grid(row=1,column=1)

image = Image.open("SVD_F_approx2.png")
image = image.resize((100, 100), Image.ANTIALIAS)
my_img2 = ImageTk.PhotoImage(image)
image_label2 = Label(image=my_img2)
image_label2.grid(row=2,column=1)

image = Image.open("SVD_F_approx3.png")
image = image.resize((100, 100), Image.ANTIALIAS)
my_img3 = ImageTk.PhotoImage(image)
image_label3 = Label(image=my_img3)
image_label3.grid(row=3,column=1)


############## Textstücke werden erzeugt und entsprechend angeordnet ##################

text_label0 = Label(text="Originalbild:")
text_label0.grid(row=0, column=0)

text_label1 = Label(text='staerkste Kompression, nur Sigma11:')
text_label1.grid(row=1, column=0)

text_label2 = Label(text='mittlere Kompression, bis Sigma22:')
text_label2.grid(row=2, column=0)

text_label3 = Label(text='schwache Kompression, bis Sigma33, sieht aus wie Original:')
text_label3.grid(row=3, column=0)


root.mainloop()

当我在 Jupyter 笔记本中运行该脚本时,它运行良好。然后我从 Jupyter 笔记本下载它作为 .py 文件,所以现在的名称是“SVD.py”。然后在 windows 命令提示符中输入:

pyinstaller --onefile SVD.py

,所以它被转换成'SVD.exe'。当我在 windows 命令提示符中启动这个 .exe 文件时,命令提示符会显示一个文本:

C:\Users\Lenovo\Documents\BA Studium\3 Semester\Perlt\Hausarbeit\dist>SVD.exe
Traceback (most recent call last):
  File "SVD.py", line 10, in <module>
ModuleNotFoundError: No module named 'numpy'
[10508] Failed to execute script SVD

在命令提示符下,我将目录更改为 C:\Users\Lenovo\Documents\BA Studium\3 学期\Perlt\Hausarbeit 'SVD.py' 文件所在的位置,然后我输入了

pip 安装 numpy

安装过程没有问题,我通过 pyinstaller 将 .py 文件再次转换为 .exe 文件。当我通过命令提示符启动 .exe 文件时:仍然是相同的错误消息。

我将“SVD.py”复制到 C:\用户\联想 我通常在其中拥有所有其他 python 脚本,并以相同的方式将其转换为 .exe 文件。 当我通过命令提示符启动 .exe 文件时,它会显示不同的错误消息:

C:\Users\Lenovo\dist>SVD.exe
Traceback (most recent call last):
  File "SVD.py", line 11, in <module>
ModuleNotFoundError: No module named 'scipy'
[13396] Failed to execute script SVD

###########EDIT############

然后我在命令提示符中输入以下内容:

SVD.py --hidden-import numpy

现在尝试启动 SVD.exe 显示,这一次(不是 numpy,而是)缺少 scipy 模块。所以我输入了提示符:

SVD.py --hidden-import scipy

尝试启动SVD.exe后,命令提示符仍然显示scipy丢失。

我在提示符中输入的SVD.py目录:

pip 安装 scipy

安装似乎成功了。尽管如此,当我尝试将 SVD.py 编译成 SVD.exe 时,它​​仍然显示 scipy 缺失:

C:\Users\Lenovo\Documents\BA Studium\3 Semester\Perlt\Hausarbeit>pyinstaller SVD.py --onefile --hidden-import scipy
115 INFO: PyInstaller: 4.1
115 INFO: Python: 3.9.1
115 INFO: Platform: Windows-10-10.0.18362-SP0
115 INFO: wrote C:\Users\Lenovo\Documents\BA Studium\3 Semester\Perlt\Hausarbeit\SVD.spec
115 INFO: UPX is not available.
115 INFO: Extending PYTHONPATH with paths
['C:\\Users\\Lenovo\\Documents\\BA Studium\\3 Semester\\Perlt\\Hausarbeit',
 'C:\\Users\\Lenovo\\Documents\\BA Studium\\3 Semester\\Perlt\\Hausarbeit']
131 INFO: checking Analysis
247 INFO: checking PYZ
300 INFO: checking PKG
300 INFO: Building because toc changed
300 INFO: Building PKG (CArchive) PKG-00.pkg
8614 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully.
8654 INFO: Bootloader c:\users\lenovo\appdata\local\programs\python\python39\lib\site-packages\PyInstaller\bootloader\Windows-64bit\run.exe
8654 INFO: checking EXE
8672 INFO: Building because name changed
8672 INFO: Building EXE from EXE-00.toc
8672 INFO: Appending archive to EXE C:\Users\Lenovo\Documents\BA Studium\3 Semester\Perlt\Hausarbeit\dist\SVD.exe
8704 INFO: Building EXE from EXE-00.toc completed successfully.

C:\Users\Lenovo\Documents\BA Studium\3 Semester\Perlt\Hausarbeit>cd .\dist

C:\Users\Lenovo\Documents\BA Studium\3 Semester\Perlt\Hausarbeit\dist>SVD.exe
Traceback (most recent call last):
  File "SVD.py", line 11, in <module>
ModuleNotFoundError: No module named 'scipy'
[2088] Failed to execute script SVD

问候 so_question_asker

【问题讨论】:

【参考方案1】:

我认为如果 PyInstaller 没有自动检测导入,您应该在实际命令中使用 --hiden-import the_import_module 标志。

您可以结帐this link,它有类似的答案。 也可以阅读documentation

【讨论】:

非常感谢您的快速反应。你的意思是,我应该在命令提示符下输入:'pyinstaller --onefile SVD.py --hidden-import numpy scipy' 这是正确的顺序吗?或者你的意思是我应该直接输入'.... the_import_module ......'? 我也阅读了文档链接并尝试了“扩展路径”的建议,没有效果,提示仍然说,它找不到 scipy-module。也许还有其他想法......? 'pyinstaller --onefile SVD.py --hidden-import numpy scipy',没错。

以上是关于将 tkinter 脚本转换为 .exe 文件后,尝试执行时出现错误:ModuleNotFoundError: No module named 'numpy'的主要内容,如果未能解决你的问题,请参考以下文章

Pyinstaller - “致命错误!将脚本转换为 exe 时无法执行脚本”

将批处理文件转换为 exe 后 Windows Defender 将文件显示为木马为啥? [关闭]

使用 cx_freeze 为 tkinter 接口创建 .exe 文件

如何将 msys shell 脚本转换为 windows exe 文件

text PyInstaller - 将python脚本转换为.exe文件

我需要将我的 python 3.6.1 脚本转换为 .EXE 文件。我怎么做?