oscartheduck wrote: > I have a small script for doing some ssh stuff for me. I could have > written it as shell script, but wanted to improve my python skills > some. > > RIght now, I'm not catching a syntax error as I'd like to. > > Here's my code: > > #!/usr/bin/env python > import sys > import os > > port = input("Please enter a port to connect on. If you're unsure or > just want the default of port 2024 just hit enter -- ") > > > try: > if port > 65535: > print "That's not a valid port number, sorry. Between 0 and 65535 > is cool." > sys.exit() > else: > cmd = 'su root -c "/usr/sbin/sshd -p %s"' % port > except SyntaxError: > cmd = 'su root -c "/usr/sbin/sshd -p 2024;exit"' > > os.system(cmd) > > > I'm under the impression that the except should catch the syntax error > and execute the "default" command, but hitting enter at the input > value doesn't lead to that. Any ideas what's going wrong? > Yes. SyntaxError is raised when the interpreter is compiling the Python into byetcodes ready for execution. This *can* happen at run time, but usually it's when you are importing a module and so it gets transmogrified into an ImportError, though you can trigger it with, for example, eval:
>>> eval("print < m s q") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<string>", line 1 print < m s q ^ SyntaxError: invalid syntax >>> However, if you run your program and give it an invalid port number surely the resulting traceback would *tell* you what exception you need to trap if you used a %d substituion rather than a %s. Since pretty much anything is valid for a %s substitution the problem is that you will be calling os.system() on a command with a non-numeric port number and not catching the resulting exception. Using input(), by the way, is a recipe for disaster with non-trustworthy users. I'd much prefer to use raw_input() and convert explicitly to integer. The easiest way to proceed would then be to perform sensible error checking on the port number before proceeding: port = raw_input("Port # (enter for 2204 default: ") if port == "": port = 2204 try: port = int(port) except ValueError: raise ValueError("Port number must be numeric") or something like that. Really you should be in a loop which terminated when you get an acceptable port number. regards Steve -- Steve Holden +44 150 684 7255 +1 800 494 3119 Holden Web LLC/Ltd http://www.holdenweb.com Skype: holdenweb http://del.icio.us/steve.holden Recent Ramblings http://holdenweb.blogspot.com -- http://mail.python.org/mailman/listinfo/python-list