问题描述:在本机环境下:win 10系统,Python 3.9.10,已经安装了Keysight IO Libraries Suite,在C:\Windows\System32下有visa32.dll 和 vis64.dll,准备实现仪器自动测试。
在vs code 中运行如下代码,输出结果为:
# pip install pyvisa
import pyvisa as visa
rm = visa.ResourceManager()
print(rm)
res = rm.list_resources()
print(res)
运行结果:
Resource Manager of Visa Library at C:\Windows\System32\visa64.dll
('ASRL7::INSTR', 'USB0::0x05E6::0x2460::04593754::0::INSTR')
但这不意味着在同样环境下,其他电脑的输出和上面结果一致,它可能会输出成这样:
Resource Manager of visa Library at py
( ASRL1::INSTR,)
甚至可能是这样(直接报错):
AttributeError:function 'viOpen' not found
也就是说,没有找到所有设备,仅只看到串口设备,我需要的USB设备没有找到,或是直接用不了。
注意到第一个和第二个的输出结果不一样:一个是Resource Manager of Visa Library at C:\Windows\System32\visa64.dll,一个是at py。很明显第一个是调用了C:\Windows\System32\visa64.dll(这是正确的),而第二个是调用了pyvisa-py后端,类似:
# pip install pyvisa-py
import pyvisa as visa
rm = visa.ResourceManager("@py")
print(rm)
res = rm.list_resources()
print(res)
这个需要自己调试环境,我目前还不知道怎么使用pyvisa-py后端尝试获取设备信息(有大佬会的可以评论区教导我一下,感谢!)。
第三个情况比较复杂:因为直接报错了,也不清楚是什么原因,这时候找到可以打印执行visa信息的库函数:
import pyvisa as visa
visa.log_to_screen()
try:
rm = visa.ResourceManager()
print(rm)
res = rm.list_resources()
print(res)
except Exception as e:
print(f"发生未知错误: {e}")
尝试打印错误信息:
pyvisa - DEBUG - Could not open Visa wrapper <class 'pyvisa.ctwrapper.highlevel.IVIVisaLibrary'>:
C:\Window\System32\visa64.dll function 'viOpen' not found
继续尝试打印第一、二种情况的信息:
206 pyvisa - DEBUG - No visa library specified, trying to find alternatives.
207 pyvisa - DEBUG - Environment variable PVISA_LIBRARY is unset.
210 pyvisa - DEBUG - No user defined configuration
214 pyvisa - DEBUG - Automatically found library files: [None, None, None, C:\Windows\system32\visa64.dll', 'C:\Windows\system32\visa64.dll']
214 pyvisa - DEBUG - No user defined library files
214 pyvisa - DEBUG - The IVI implementation available
214 pyvisa - DEBUG - No user defined configuration
218 pyvisa - DEBUG - Automatically found library files: [None, None, None, C:\Windows\system32\visa64.dll', 'C:\Windows\system32\visa64.dll']
220 pyvisa - DEBUG - No user defined library files
220 pyvisa - DEBUG - Library signatures: 90 ok, 0 failed
220 pyvisa - DEBUG - Created library wrapper for C:\Windows\system32\visa64.dll
227 pyvisa - DEBUG - viOpenDefaultRM(<ViObject object at 0x000001E1CC2508C0>, ') -> 0
228 pyvisa - DEBUG - Created ResourceManager with session 1024
Resource Manager of Visa library at C:\Windows\system32\visa64.dll
234 pyvisa - DEBUG - viFindRsrc(1024, '?*::INSTR', <ViObject object at 0x000001E1CC2508C0>, '_c_ulong(5)', <ctypes.c_char_Array_256 object at 0x000001E1CC250F40>) -> 0
235 pyvisa - DEBUG - viFindNext(<ViObject object at 0x000001E1CC2508C0>, <ctypes.c_char_Array_256 object at 0x000001E1CC250F40>) -> 0
235 pyvisa - DEBUG - viFindNext(<ViObject object at 0x000001E1CC2508C0>, <ctypes.c_char_Array_256 object at 0x000001E1CC250F40>) -> 0
236 pyvisa - DEBUG - viClose(<ViObject object at 0x000001E1CC2508C0>, ) -> 0
('ASRL7::INSTR', 'USB0::0x0957::0x0607::MY53009844::0::INSTR')
892 pyvisa - DEBUG - No visa library specified, trying to find alternatives.
893 pyvisa - DEBUG - Environment variable PVISA_LIBRARY is unset.
900 pyvisa - DEBUG - No user defined configuration
945 pyvisa - DEBUG - Automatically found library files: [None, None, None, None, None]
946 pyvisa - DEBUG - No user defined library files
946 pyvisa - DEBUG - Did not find IVI binary
964 pyvisa - DEBUG - SerialSession is correctly imported.
025 pyvisa - DEBUG - USBSession and USBRawSession were not imported No backend available.
135 pyvisa - DEBUG - TCPSISession was correctly imported.
138 pyvisa - DEBUG - GPIBSession was not imported No module named 'gpib'.
139 pyvisa - DEBUG - pyvisa-py is available.
139 pyvisa - DEBUG - Created library wrapper for py
139 pyvisa - DEBUG - Created ResourceManager with session 6532645
Resource Manager of Visa Library at py
('ASRL1::INSTR',)
2025-04-23 14:29:15,184 pyvisa - DEBUG - Closing ResourceManager (session: 6532645)
很明显,对于第二种情况,在Automatically found library files中没有看见'C:\Windows\system32\visa64.dll'存在:
我们只需要在rm = visa.ResourceManager()种传入dll库地址即可解决,例如:
import pyvisa as visa
rm = visa.ResourceManager('.\\visa32.dll') # or r"C:\Window\System32\visa64.dll"
print(rm)
res = rm.list_resources()
print(res)
运行结果:
Resource Manager of Visa Library at .\visa32.dll
('ASRL7::INSTR', 'USB0::0x05E6::0x2460::04593754::0::INSTR')
然而,这种方法无法解决上面报错问题:
pyvisa - DEBUG - Could not open Visa wrapper <class 'pyvisa.ctwrapper.highlevel.IVIVisaLibrary'>:
.\visa64.dll function 'viOpen' not found
后面才了解可能是python 加载dll的问题:
import pyvisa as visa
import os
# load dll
os.add_dll_directory(r"C:\Program Files\Keysight\IO Libraries Suite\bin")
rm = visa.ResourceManager()
print(rm)
res = rm.list_resources()
print(res)\
运行结果:
Resource Manager of Visa Library at C:\Windows\System32\visa64.dll
('USB0::0x05E6::0x2460::04593754::0::INSTR')
参考:OSError: 无法打开 VISA 库: 找不到函数 'viOpen' ·问题 #603 ·pyvisa/pyvisa
visa.ResourceManager() got function 'viOpen' not found in Windows · Issue #385 · pyvisa/pyvisa
若要将该visa 打包成exe文件来寻找设备信息,考虑以上三种情况,建议:
py文件:
import pyvisa as visa
import os
def resoure_path(lib_path)
#获取打包后的资源路径
if getattr(sys,'frozen',False):
base_path = sys._MEIPASS
else:
base_path = os.path.abspath(".")
return os.path.join(base_path, lib_path)
lib_path = "visa64.dll"
lib_path = resoure_path(lib_path)
rm = visa.ResourceManager(lib_path)
print(rm)
res = rm.list_resources()
print(res)
将dll库打包进exe:
pyinstaller --add-data =" visa64.dll;." demo.py
在下载好软件Keysight IO Libraries Suite时,即可正确访问到在IO软件种查看的设备。
本人经验不足,恕不能解决所有关于pyvisa的问题,希望该文章可以帮助需要的人。
pyvis文档:PyVISA:使用 Python 控制您的仪器 — PyVISA 1.15.1.dev3+gb7f5010 文档