Small socket problem

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Mon Feb 9 09:10:13 EST 2009


En Mon, 09 Feb 2009 07:43:36 -0200, John O'Hagan <research at johnohagan.com>  
escribió:

> I'm using the socket module (python 2.5) like this (where 'options'  
> refers to
> an optparse object) to connect to the Fluidsynth program:
>
>             host = "localhost"
>             port = 9800
>             fluid = socket(AF_INET, SOCK_STREAM)
>             try:
>                 fluid.connect((host, port))  #Connect if fluidsynth is  
> running
>             except BaseException:
>                 print "Connecting to fluidsynth..." #Or start fluidsynth
>                 soundfont =  options.soundfont
>                 driver = options.driver
>                 Popen(["fluidsynth", "-i", "-s", "-g", "0.5",
>                 "-C", "1",  "-R", "1", "-l", "-a", driver, "-j",  
> soundfont])
>                 timeout = 50
>                 while 1:
>                     timeout -= 1
>                     if timeout == 0:
>                         print "Problem with fluidsynth: switching to  
> synth."
>                         play_method = "synth"
>                         break
>                     try:
>                         fluid.connect((host, port))
>                     except BaseException:
>                         sleep(0.05)
>                         continue
>                     else:
>                         break
>
> (I'm using BaseException because I haven't been able to discover what
> exception class[es] socket uses).

Usually socket.error, which is a subclass of IOError, but others might  
happen too I think. In any case, the most generic except clause you should  
use is
try:
except Exception: ...
(because you usually don't want to catch KeyboardInterrupt nor SystemExit,  
that is, let Ctrl-C and sys.exit() do their work)

> The problem is that this fails to connect ( the error is "111: Connection
> refused") the first time I run it after booting if fluidsynth is not  
> already
> running, no matter how long the timeout is; after Ctrl-C'ing out of the
> program, all subsequent attempts succeed. Note that fluidsynth need not  
> be
> running for a success to occur.

Always the same exception? In both lines?

-- 
Gabriel Genellina




More information about the Python-list mailing list