python文件双击闪退
-
一般的解决办法是在这个程序的末尾加上input()
简单来说如果不能解决,要考虑电脑的环境是否有问题
你需要检查你的Windows目录下是否有py.exe这个文件,直接按Win键搜索也可以,这个文件是Python Lancher,程序应该 在(C:\Windows)下面
py.exe这个程序类似于记事本,他是默认打开python文件并且执行的程序,如果没有可能是安装的时候没有打上勾 for all users
-
确认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文件就可以直接运行它
- ModuleNotFoundError: No module named ‘QtProgram’
举例说明: 这是我的目录结构
其中所有的要运行代码放在了src里面,uiFile里面放的是ui文件那我想要直接运行单个程序时(在Windows10的资源管理器里面,为了保证代码的可读性,避免不了调用),可能会报错
特别是路径分开的各个文件夹之间的调用,其中src
和 uiFile
是项目其中的文件夹
像这个代码在idea或者pycharm里面运行是不会报错的,但是如果你把这个项目目录/文件夹复制到其他的地方,双击运行就会闪退
通过命令行/终端 运行发现
会收到如下这样的报错,并且我所有可能用的包里面都含有__init__.py
文件
这里我通过研究发现,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