```python
rm = pyvisa.ResourceManager("C:/Windows/System32/visa32.dll")
keithley_analyzer = rm.open_resource('GPIB0::17::INSTR')
visa address没错,但是open这句代码报错了,报错如下:
Traceback (most recent call last):
File "E:\workspace\project\pythonProject3\main.py", line 46, in <module>
keithley_analyzer = rm.open_resource(visa_address)
File "E:\workspace\project\pythonProject3\venv\lib\site-packages\pyvisa\highlevel.py", line 3247, in open_resource
info = self.resource_info(resource_name, extended=True)
File "E:\workspace\project\pythonProject3\venv\lib\site-packages\pyvisa\highlevel.py", line 3174, in resource_info
ret, err = self.visalib.parse_resource_extended(self.session, resource_name)
File "E:\workspace\project\pythonProject3\venv\lib\site-packages\pyvisa\ctwrapper\functions.py", line 2087, in parse_resource_extended
res = [
File "E:\workspace\project\pythonProject3\venv\lib\site-packages\pyvisa\ctwrapper\functions.py", line 2088, in <listcomp>
buffer_to_text(val)
File "E:\workspace\project\pythonProject3\venv\lib\site-packages\pyvisa\ctwrapper\types.py", line 74, in buffer_to_text
return buf.value.decode("ascii")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 0: ordinal not in range(128)
```
https://blog.csdn.net/l769255844/article/details/76579327/
问题是出来用pyinstaller转py为exe文件时出现的报错,如果是在ide中出错,就可以绕道他处寻解了,与之无关。
不晓得现在还有没有人使用py2exe工具,py2exe不更新了,使用的时候特别容易出问题,动则什么文件什么依赖包就找不到了,手工都找不到。所以,当你用py2exe时,遇到了问题,五分钟解决不了,就赶紧转用其他工具,比如pyinstaller,不要再纠结了。
当用pyinstaller时,有时会出现如下报错:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7 in position 3: ordinal not in range(128)
当然有可能,这里的byte不一样,position更有可能不一样。
这时候,不要慌张去百度后按部就班去做什么的(无非就是在文件头部加个判断转换之类的),大多数情况下,你这里的position和byte和人家的不一定一样,你照做了,固然还是有这个问题。
这时候你要做的是,认真地分析命令行的提示,
Traceback
往往给出了你出错前程序封装过程的最近十几个轨迹,将轨迹的最后一个,也就是UnicodeDecodeError
错误提示的上面几行给出的运行到的位置。如:
File "D:\Python27\lib\site-packages\PyInstaller\utils\win32\winmanifest.py", line 721, in load_dom
(self.filename, manifest.name))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7 in position 3: ordinal not in range(128)
把错误文件,对应的python代码部分找出来,再根据报错信息想办法进行修改,不知道这么修改,这时候就可以百度了。
比如说我找到了这个位置,错误提示说“ascii”不能解码,说明这部分代码所用的命令让它解码出错了。我分析了一下,给两个变量加个个str()
,不让他误解码,问题就解决了。
(str(self.filename), str(manifest.name)))
遇到问题一定要静下心来,认真分析,不要像无头苍蝇似了,复制黏贴错误信息到浏览器,乱试别人的解决方法。知其然不知所以然,最后只会一团糟。
有人说py2exe太过陈旧缺少维护操作不便,推荐PyInstaller项目 www.pyinstaller.org可用一句命令打包:
pyinstaller -F -w -i manage.ico app.py
-F:打包为单文件
-w:Windows程序,不显示命令行窗口
-i:是程序图标
app.py是你要打包的py文件
另外需要pywin32。安装方法:先跑pip install pywin32
再跑pip install pyinstaller
即可,多么简单。所以,尽快方法,使用麻烦,又容易出错的py2exe吧。
解决方案:
这个错误表示Python无法使用默认的'ascii'编解码器解码字节,因为该字节不在范围内。解决办法是修改编码方式,指定为utf-8或其他编码方式。具体步骤如下:
先来看下错误提示中的例子:UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 0: ordinal not in range(128)。这里的0xb0是出错字节的十六进制表示,position 0 是字节在字符串中的位置。
分析报错内容,发现Python使用默认的'ascii'编解码器解码字节时出现了错误。可以通过修改编解码器来修复该问题。
在Python 2.x 中,可以通过以下代码修改编解码器为utf-8,这样就可以将所有的Unicode字符串都转换为utf-8编码,从而避免UnicodeDecodeError错误:
import sys reload(sys) sys.setdefaultencoding('utf8')
在Python 3.x 中,字符串默认使用Unicode编码,因此不需要设置默认编解码器。如果需要在字符串和字节之间进行转换,可以使用encode()和decode()方法指定编码方式。
对于报错代码的例子,可以对代码进行如下修改:
import numpy as np
dt = np.dtype([('name', 'S10'), ('age', int)]) y = np.array([("小明", 10), ("小黑", 20), (" 小红", 30), ("小白", 40)], dtype=dt) print("y数组: ") print(y)
print("按age排序:") print(np.sort(y, order="age"))
print("按name排序:") print(np.sort(y, order="name".encode('utf-8')))
参考资料: