I’ve been hacking on other people’s python3 code for a while doing porting and bugfixes but so far my own code has been tied to python2 because of dependencies. Yesterday I ported my first personal script from python2 to python3. This was just a simple, one file script that hacks together a way to track how long my kids are using the computer and log them off after they’ve hit a quota. The kind of thing that many a home sysadmin has probably hacked together to automate just a little bit of their routine. For that use, it seemed very straightforward to make the switch. There were only four changes in the language that I encountered when making the transition:
- octal values. I use octal for setting file permissions. The syntax for octal values has changed from
"0755"
to"0o755"
- exception catching. No longer can you do:
except Exception, exc
. The new syntax is:except Exception as exc
. - print function. In python2,
print
is a keyword so you do this:print 'hello world'
. In python3, it’s a function so you write it this way:print('hello world')
- The strict separation of bytes and string types. Required me to specify that one subprocess function should return string instead of bytes to me
When I’ve worked on porting libraries that needed to maintain some form of compat between python2 (older versions… no nice shiny python-2.7 for you!) and python3 these concerns were harder to address as there needed to be two versions of the code (usually, maintained via automatic build-time invocation of 2to3). With this application/script, throwing out python2 compatibility was possible so switching over was just a matter of getting an error when the code executed and switching the syntax over.
This script also didn’t use any modules that had either not ported, been dropped, or been restructured in the switch from python2 to python3. Unlike my day job where urllib’s restructuring would affect many of the things that we’ve written and lack of ported third-party libraries would prevent even more things from being ported, this script (and many other of my simple-home-use scripts) didn’t require any changes due to library changes.
Verdict? Within these constraints, porting to python3 was as painless as porting between some python2.x releases has been. I don’t see any reason I won’t use python3 for new programming tasks like this. I’ll probably port other existing scripts as I need to enhance them.
Oh, I am so totally using nanny.py. 🙂
Cool. I better update the –help text then 🙂
On the stupid question level, since ‘who’ returns you the last login time, why don’t you use this information to check if the time is above the quota ?
Then the db could just register when you log-out someone on a given day and check if this person has already been logoff today. But at the end it should do the same thing 🙂
I think that who doesn’t return information about past logins. So it doesn’t keep them from logging in for a portion of their quota, logging out, and repeating as often as they like. I remember thinking about using `last` output at one time but went with a db instead… I don’t remember why.
Just nitpicking, really, but you state that you needed to make only three changes, but you subsequently list four.
Fixed! Thanks 🙂