The Danube at Night Sunset Annapurna South in the Early Morning Mardi Himal Trail Buildings and a Bridge Cropped Cementerio de Trenes de Uyuni Old Man in Siding Sheepherders and Annapurna South Fog Rolling In Hong Kong from the Peak Fall Colors Headfirst Resting Bluebird Skies Sand Dunes Market Flags Grafitti SF Cable Car Route Yosemite Fall Leaves Chinchero at Sunset Prayer Flags Pisac Hillside Fish Market Sunset from Marshall Beach, SF The Golden Gate at Night Vocano Scarred Mountains Stars Over Annapurna South Bodie Night Cats Annapurna South Eastern Sierras Under Shadow Bay Area Sunrise Green River Canyons at Sunrise Prepping to FIght Half Dome at Sunset Crosswalk The Buttermilks Cumhuriyet Anıtı Zabriskie Point Photographers Monument Valley White Mountains Sunset Rolling Fog Phewa Boats Mardi Himal Trail Rooster Fights at Forest Camp Marin Headlands Snow and Shadows Twilight Fog Zabriskie Point Very rare deserted street Llamas, Alpacas and Mutants Golden Gate Annapurna South Under the Stars Sunset From Moro Rock Alamo Square Half Dome at Sunset Boudhanath Stupa Machhapuchhre Temple Statue The Blue Mosque

Python virtualenvwrapper and Logging

January 20, 2011 —

I ran into this issue, and couldn't find a resolution anywhere online. Well, I figured it out, and thought that I'd put it online for others to find.

The issue was that I got exception tracebacks when sourcing the /usr/local/bin/virtualenvwrapper.sh script upon bash initialization. However, the exception happens while Python is running it's atexit handlers. So the stack was only 3 levels deep. I'm running virtualenv and virtualenvwrapper on my Ubuntu 9.04 server.

Here's the output of the exception that I got:

[streeter@mail]:~$ source /usr/local/bin/virtualenvwrapper.sh
Traceback (most recent call last):
File "/usr/lib/python2.6/logging/handlers.py", line 72, in emit
self.doRollover()
File "/usr/lib/python2.6/logging/handlers.py", line 129, in doRollover
os.rename(self.baseFilename, dfn)
OSError: [Errno 13] Permission denied
Traceback (most recent call last):
File "/usr/lib/python2.6/logging/handlers.py", line 71, in emit
if self.shouldRollover(record):
File "/usr/lib/python2.6/logging/handlers.py", line 145, in shouldRollover
self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
ValueError: I/O operation on closed file
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
File "/usr/lib/python2.6/atexit.py", line 24, in _run_exitfuncs
func(*targs, **kargs)
File "/usr/lib/python2.6/logging/__init__.py", line 1508, in shutdown
h.flush()
File "/usr/lib/python2.6/logging/__init__.py", line 754, in flush
self.stream.flush()
ValueError: I/O operation on closed file
Error in sys.exitfunc:
Traceback (most recent call last):
File "/usr/lib/python2.6/atexit.py", line 24, in _run_exitfuncs
func(*targs, **kargs)
File "/usr/lib/python2.6/logging/__init__.py", line 1508, in shutdown
h.flush()
File "/usr/lib/python2.6/logging/__init__.py", line 754, in flush
self.stream.flush()
ValueError: I/O operation on closed file
[streeter@mail]:~$

As you can see, not a lot to go with. So it seems that virtualenvwrapper does some logging, and it looks like the logging module wants to rename that logfile. Digging even deeper, the logging module wants to rotate the logfile because it got too big. Well, where is the log file? Turns out that virtualenvwrapper sets up a logfile called hook.log at the root of the WORKON_HOME environment variable. My WORKON_HOME is set to /usr/local/pythonenv and lo and behold, that directory was not writeable by my logged in user. Thats an easy fix. Just change the permissions.