python报错处理方案(持续更新) 最后更新时间:2024年06月07日 ### pyhook pyhook安装需要直接从官网下载轮子安装,且仅支持到python3.7 #### 报错:ModuleNotFoundError: No module named 'pyHook' 俗话说,解决不了问题,就把问题的来源解决掉。 pyhook可以用pywinhook来替代。通过pip安装pywinhook以后,直接进报错的源码处把pyhook的导入删除掉。 ![直接删除掉](https://yidaimingjvn.xyz/usr/uploads/2023/04/3644577965.png) 直接删除掉 ![删除过后](https://yidaimingjvn.xyz/usr/uploads/2023/04/1719968232.png) 删除过后 ### pymouse #### 报错:ModuleNotFoundError: No module named 'windows' 相信我,改源码很有效果。 windows这个库不是你的本地库,而是pymouse自带的库,这里需要进入报错的位置,将windows改为pymouse.windows ![将windows改为pymouse.windows](https://yidaimingjvn.xyz/usr/uploads/2023/04/3041822851.png) ### pykeyboard #### 报错:ImportError: cannot import name 'PyKeyboard' from 'pykeyboard' 原来互联网上的导入方案没办法正常导入PyKeyboard了,需要直接从pykeyboard的windows下直接导入 ![直接导入](https://yidaimingjvn.xyz/usr/uploads/2023/04/3200402339.png) #### 报错:提示有3到4个参数,但是给出了五个。 原本的pymouse的代码里面的click方法是支持双击的,官方通过n参数和for循环来支持双击及多击,后面的更新中又取消了循环控制多击。而网上的教学大多会按老版本代码解释设置第四个参数n,这里直接进源码补充原来的循环就可以了。 #### 报错:pandas无法处理excel文件 多方面原因。pandas下的依赖之一`xlrd`在旧版本可以处理xlsx格式的文件,而新版本只支持xls。建议采用1.2.0版本解决改问题。 ````python pip install xlrd==1.2.0 ```` #### 报错:UnboundLocalError: local variable 'datat' referenced before assignment 一句话,在函数内部更改全局变量就会出现此错误。 直接给出两个例子说明为什么出现这一错误及如何避免: ````python a= 3 def temp(): print(a) temp() #输出的结果为3 ```` 在上面一段代码中,函数temp的操作是打印a的值,但函数内部并没有对a进行定义,此时系统会在外部寻找a的值,而我们在函数外部给a赋值为3,这种在函数外部赋值的变量被称为全局变量(global variable),这种情况下运行函数temp不会出错,但是下面一种情况就会报错: ````python a= 3 def temp(): print(a) a+=1 temp() #会报错, UnboundLocalError: local variable 'a' referenced before assignment ```` 原因是我们定义的函数temp内部第一次打印a是调用的全局变量,而打印后却令a=a+1,在函数内部试图更改全局变量a导致错误。如果我们确实希望通过函数temp打印全局变量a,并且将a的值加1,那么就要在函数内部声明全局变量: ````python a= 3 def temp(): global a #声明我们在函数内部使用的是在函数外部定义的全局变量a print(a) a+=1 temp() #调用temp函数,不会再报错了 a #此时就会发现a的值确实变成4 ```` **总结**:不要在函数内部改变全局变量的值,如果确实想改变全局变量的值(以a为例),那么需要在函数内部首先声明,即加上global a这一行代码。 要解决标题的问题上面的内容已经足够了,下面是一些关于全局变量和局部变量的补充: 与全局变量相对,定义在函数内部的变量称为局部变量(local variable),局部变量只在函数内部起作用,例如: ````python def temp(): a= 3 print(a) temp() #输出结果为3 print(a) #出错,NameError: name 'a' is not defined提示a未定义 ```` 这一次我们没有在函数外部定义a,而仅在函数temp内部定义a=3,此时a就是局部变量,所以在函数外部是无法访问a的。 再看一个例子: ````python a= 3 #全局变量 def temp(): a= 4 #局部变量 print(a) temp() #返回4,因为在函数内部a=4 print(a)#返回3,因为在函数外部a被赋值为3 ```` 把上面一段代码与本文最开头的一段代码对比就会发现,在函数内部访问变量a时,系统首先在函数内部找有没有定义局部变量a,如果找不到,那么就会在函数外部寻找有没有定义全局变量a,都找不到才会报错。而如果在函数外部访问变量a,那么只会寻找全局变量,如果没有就会报错,而不管我们有没有在某个函数内部定义局部变量a。 **引用自:**[local variable referenced before assignment 原因及解决办法](https://blog.csdn.net/sinat_40304087/article/details/115701595 "local variable referenced before assignment 原因及解决办法") ### from __future__ 在开头加上from __future__ import print_function这句之后,即使在python2.X,使用print就得像python3.X那样加括号使用。python2.X中print不需要括号,而在python3.X中则需要。 ```python # python2.7 print "Hello world" # python3 print("Hello world") ``` 如果某个版本中出现了某个新的功能特性,而且这个特性和当前版本中使用的不兼容,也就是它在该版本中不是语言标准,那么我如果想要使用的话就需要从future模块导入。 其他例子: ```python from __future__ import division , from __future__ import absolute_import from __future__ import with_statement ``` 等等 加上这些,如果你的python版本是python2.X,你也得按照python3.X那样使用这些函数。
Comments | NOTHING