2022年 11月 5日

python文件闪退 ModuleNotFoundError:No module named ImportantError : DLL load failed: %1 不是有效的 Win32 应用程序

python文件双击闪退

  1. 一般的解决办法是在这个程序的末尾加上input()
    简单来说如果不能解决,要考虑电脑的环境是否有问题
    你需要检查你的Windows目录下是否有py.exe这个文件,直接按Win键搜索也可以,这个文件是Python Lancher,程序应该 在(C:\Windows)下面
    py.exe这个程序类似于记事本,他是默认打开python文件并且执行的程序,如果没有可能是安装的时候没有打上勾 for all users
    在这里插入图片描述

  2. 确认py.exe已经存在,但是也闪退
    这个需要确认一下你的电脑是否安装了多个python,因为这个py.exe文件只有一个,可能是不同的python版本造成,64位的程序不能运行在32位的程序,这个我的错误是
    我本身安装的是python3.7 32bit的, 后来安装了64位python(vs上的默认是_x64),使得本身的32位的py.exe被vs的_x64位的覆盖了
    python32位和64位有什么区别

结果是这样的
在这里插入图片描述
这里不是python版本的问题,我是重装的python版本和上一次的版本不同
在这里插入图片描述

  • 应用场景: 比如我写了一个Qt的窗体程序,我想要把项目文件夹复制到其他地方,再双击py文件就可以直接运行它
  1. ModuleNotFoundError: No module named ‘QtProgram’
    举例说明: 这是我的目录结构
    在这里插入图片描述
    在这里插入图片描述

其中所有的要运行代码放在了src里面,uiFile里面放的是ui文件那我想要直接运行单个程序时(在Windows10的资源管理器里面,为了保证代码的可读性,避免不了调用),可能会报错
在这里插入图片描述
特别是路径分开的各个文件夹之间的调用,其中srcuiFile 是项目其中的文件夹
在这里插入图片描述
像这个代码在idea或者pycharm里面运行是不会报错的,但是如果你把这个项目目录/文件夹复制到其他的地方,双击运行就会闪退
通过命令行/终端 运行发现
会收到如下这样的报错,并且我所有可能用的包里面都含有__init__.py文件

ERROR
这里我通过研究发现,pycharm是在运行脚本之前做了一个处理,他将项目的目录添加到了环境变量中,所以运行该程序时会在控制台打印
在这里插入图片描述
通过尝试,我发现将项目的目录添加到path(python的环境变量)即可,所以为了方便,写了一个小方法add_path.py他的位置位于要运行的代码的同层目录,然后我再在要运行的程序的开头调用此方法,再使用
python xxx.py或者 py xxx.py就不会报错
在这里插入图片描述
该方法的代码(返回值为当前的文件(add_path.py)的绝对路径),后面又进行了修改,添加了flag作为标志位

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time     : 3/9/2020 下午 6:20

"""
import sys
from add_path import root_path
sys.path.append(root_path())
# 使用以上三个步骤将包的路径添加至环境变量

由于 root_path 该方法添加了flag, 所以直接调用即可
from add_path import root_path
root_path(1)
"""

import os


def root_path(flag=None):
    """配置临时Module环境变量/将module添加到sys.path"""
    p = os.path.abspath(__file__)
    if "\\" in p:
        p = p.replace('\\', '/')
    abs_path = p.replace('QtProgram/src/add_path.py', '')
    if flag:
        import sys
        sys.path.append(abs_path)
    return abs_path


if __name__ == '__main__':
    print(root_path())
    print(os.path.realpath(__file__))

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

调用方法,在你导入包之前调用即可,这里把上面两行注释取消掉,即可生效.
这里的QtProgramm是pyqt5这个文件夹下的一个pkg,根据需要将父级下的子集给替换掉
root_path一定要在你导入的包的前面
在这里插入图片描述
这样是为了方便学习,不用重复写同样的代码,(但是同时造成了不可避免的调用),同时可以随意运行
add_path.py应该在和要运行的文件的同层
单独执行add_path.py的运行结果
在这里插入图片描述

用法:
  • 1
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time     : 3/9/2020 下午 4:22


from add_path import root_path
root_path(1)

if __name__ == '__main__':
    from QtProgram.src.QtConfig import *
    from QtProgram.uiFile.SignalsSlots import Ui_MainWindow

    application(Ui_MainWindow)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

我的QtConfig.py文件

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time     : 3/9/2020 下午 4:52

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow


def application(_class):
    app = QApplication(sys.argv)
    win = QMainWindow()
    ui = _class()
    ui.setupUi(win)
    win.show()
    sys.exit(app.exec_())

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

尝试

from add_path import root_path
# sys.path.append('C:\\Users\\abcabc\\Documents\\learningprocess\\python3\\lib\\pyqt5\\QtProgram\\')     # 不可行

# 导入方式1
for i in [
    # 'C:\\Users\\abcbac\\Documents\\learningprocess\\python3\\lib\\pyqt5',    # 导入父级(最外层)绝对路径
]:
    sys.path.append(i)

# 2. 或者使用下面导入
root = root_path()
sys.path.append(root)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13