Wednesday, October 20, 2010

Switchpy

One of the consequences of the 2.x-to-3.x Python changeover is that I need to keep both versions around for a while on my Windows dev workstation.

Actually, strike that: I need to keep many versions around:
  • 2.5.4, because that's the earliest version we support at work for some internal tools
  • 2.6.6, because one particular internal tool jumped the gun and started using the "with" statement before we migrated to...
  • 2.7, because that's what we're migrating those internal tools to (slowly)
  • 3.1.2, because that's what we're targeting for new development
  • A "special" 3.1.2, which mimics the version we've modified for use in our embedded devices
  • The most recent 3.2 alpha, for testing
  • A 3.2 trunk install, for testing patches
Virtualenv doesn't exactly do what I want: you have to install it from within an already-installed version of Python, and it doesn't support Python 3 yet (although there is a fork that does). Plus it doesn't handle anything other than environment variables--it doesn't understand Windows' defaults.

Ned Batchelder wrote a neat script that does some of that, but again, it doesn't handle everything.

So starting from Ned's script, I came up with switchpy:
  • Supports Windows Python versions from 2.5 up to 3.2
  • Changes the local PATH environment in the current shell (via the same batchfile trick as mpath)
  • Updates the Registry-based associations (via code from Ned's script)
  • Pings Explorer so that if you run "python.exe" from the Start | Run command, it notices the update
  • Automatically reads installed official versions from the Registry, so you can say "switchpy 31" instead of "switchpy c:\python31"
So now, testing scripts in multiple versions of Python is as easy as:


C:\src\myscript>switchpy 25
Switching to Python at C:\Python25\...
Python is now C:\Python25\

C:\src\myscript>py.test
============================= test session starts =============================
python: platform win32 -- Python 2.5.4 -- pytest-1.3.0
test object 1: C:\src\myscript

myscript\tests\test_script.py ...

========================== 3 passed in 0.03 seconds ===========================

C:\src\myscript>switchpy 31
Switching to Python at C:\Python31\...
Python is now C:\Python31\

C:\src\myscript>py.test
============================= test session starts =============================
platform win32 -- Python 3.1.2 -- pytest-1.3.1
test object 1: C:\src\myscript

myscript\tests\test_script.py ...

========================== 3 passed in 0.03 seconds ===========================




For now, you can find switchpy in the same bitbucket repo as mpath; if I add any more scripts, I'll probably end up making it a more general repo.

4 comments:

Ned said...

Tim, very cool! As it happens, I have a simple-minded switchpy.cmd that this would nicely replace. Thanks.

David said...

Nice script. Note that the registry keys created in change_file_associations get a double backslash since pydir has already a tailing backslash.

Ali said...

This is great; thank you!

Charango Saavedra-Rosas said...

Hey Man! Many thanks, you have saved my day... :)