PyVISA on OSX
So after some persistance, I’ve managed to get PyVISA working under OS X 10.6.8 Snow Leopard on a late 2008 MacBook Pro.
- Download and install NI VISA 5.1.2 for OSX
- In your home directory, create the file
.pyvisarcwith the contents
VISA library: /Library/Frameworks/VISA.framework/VISA
- Download and untar PyVISA 1.4
- Install as root with
$ sudo easy_install PyVISA-1.4
Now, NI VISA 5.1.2 was compiled for 32 bit systems – check this with:
$ file /Library/Frameworks/VISA.framework/VISA
If it returns i386, not x86_64, you’ve got a 32 bit binary. If you try to use PyVISA as shipped with OSX, it will default to 64 bit mode. When you try to
import visa, you’ll get several errors reading
no suitable image found and
no matching architecture in universal wrapper.
This is a CTYPES problem and discussed in this stackoverflow question.
It is possible to force OSX to run Python in 32 bit mode by
$ export VERSIONER_PYTHON_PREFER_32_BIT=yes
Which you could put in your
.bashrc to run every time you open a new shell. But I didn’t want to default to 32 bit python, I’d rather force it into 32 bit mode when needed.
So, to my
.profile I added
alias python386='arch -i386 python'
To force a script to execute under 32 bit Python, rather than including the line
#!/usr/bin/python, I start my script with
#!/usr/bin/env arch -i386 python.
I’m still working on a way to force iPython to run in 32 bit mode, if started with
arch it still calls system
python. Most unfortunately, I do not have 32 bit versions of many useful packages (e.g.,
pylab) forcing me to save data (say as a CSV file) and process it with 64 bit Python). That will become really tiresome if I try to be interactive with a PyVISA.
I specified the version numbers that I used, but am unsure if they are required, just what worked for me.
Below, I’ve included a short demo, verifying proper operation of the HP/Agilent 34401A.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#!/usr/bin/env arch -i386 python # pyvisa calls NI visa which is compiled with 32 bits, so run python in 32 bit from visa import * inst = SerialInstrument('ASRL1', baud_rate = 9600, data_bits = 7, stop_bits = 2, parity = even_parity, term_chars = CR+LF, end_input = term_chars_end_input, send_end = True, delay = 2 ) inst.write('SYST:REM') inst.write('*RST') sleep(10) inst.write('SYST:REM') print inst.ask('*IDN?')
It should print
HEWLETT-PACKARD,34401A,0,11-5-2, or whatever your software version is.