If you have been using PyVISA before version 1.5, you might want to read Migrating from PyVISA < 1.5.
Let’s go in medias res and have a look at a simple example:
>>> import visa >>> rm = visa.ResourceManager() >>> rm.list_resources() ('ASRL1::INSTR', 'ASRL2::INSTR', 'GPIB0::14::INSTR') >>> my_instrument = rm.open_resource('GPIB0::14::INSTR') >>> print(my_instrument.query('*IDN?'))
This example already shows the two main design goals of PyVISA: preferring simplicity over generality, and doing it the object-oriented way.
visa, we create a
ResourceManager object. If called
without arguments, PyVISA will use the default backend (NI) which tries to find
the VISA shared library for you. You can check, the location of the shared
library used simply by:
>>> print(rm) <ResourceManager('/path/to/visa.so')>
In some cases, PyVISA is not able to find the library for you resulting in
OSError. To fix it, find the library path yourself and pass it to
the ResourceManager constructor. You can also specify it in a configuration
file as discussed in Configuring the backend.
Once that you have a
ResourceManager, you can list the available resources
list_resources method. The output is a tuple listing the
VISA resource names. You can use a dedicated regular expression syntax to
filter the instruments discovered by this method. The syntax is described in
default value is ‘?*::INSTR’ which means that by default only instrument
whose resource name ends with ‘::INSTR’ (in particular USB RAW resources and
TCPIP SOCKET resources are not listed).
In this case, there is a GPIB instrument with instrument number 14, so you ask
ResourceManager to open “‘GPIB0::14::INSTR’” and assign the returned
object to the my_instrument.
open_resource has given you an instance of
(a subclass of the more generic
>>> print(my_instrument) <GPIBInstrument('GPIB::14')>
Resource subclasses representing the different types of
resources, but you do not have to worry as the
ResourceManager will provide
you with the appropriate class. You can check the methods and attributes of
each class in the Resource classes
Then, you query the device with the following message:
Which is the standard GPIB message for “what are you?” or – in some cases –
“what’s on your display at the moment?”.
query is a short form for a
write operation to send a message, followed by a
is the same as:
>>> my_instrument.write('*IDN?') >>> print(my_instrument.read())
Example for serial (RS232) device¶
Consider an Oxford ITC4 temperature controller, which is connected through COM2 with my computer. The following code prints its self-identification on the screen:
itc4 = rm.open_resource("COM2") itc4.write("V") print(itc4.read())
Instead of separate write and read operations, you can do both with
query() call. Thus, the above source code is equivalent to:
It couldn’t be simpler.