Updated : [19 août 2011] une nouvelle version de ce script avec un code plus pythonique (testé avec pylint) est dispo.

vigimeteo.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#       vigilance.py
#       
#       Copyright 2011 olivier watte  avaland.org
#       
#       This program is free software; you can redistribute it and/or modify
#       it under the terms of the GNU General Public License as published by
#       the Free Software Foundation; either version 2 of the License, or
#       (at your option) any later version.
#       
#       This program is distributed in the hope that it will be useful,
#       but WITHOUT ANY WARRANTY; without even the implied warranty of
#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#       GNU General Public License for more details.
#       
#       You should have received a copy of the GNU General Public License
#       along with this program; if not, write to the Free Software
#       Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#       MA 02110-1301, USA.

import feedparser
import sys

#~ import logging
#~ 
#~ logging.basicConfig(level=logging.INFO,
                    #~ format='%(asctime)s %(levelname)s %(message)s')

def main():
    URL_FEED_VIGILANCE = "http://www.meteo.gp/rss/rss_vigi.xml"

    USAGE = '\n'.join(['retrieves weather alert level for French West Indies and French Guyane from meteo.gp website',
    'usage : %prog <area_alias>',
    'where area_alias in :',
    '****************************************',
    '* area         * aliases               *',
    '****************************************',
    '* Iles du Nord * idn, ilesdunord, nord *',
    '* Guadeloupe   * gp, guadeloupe, 971   *',
    '* Martinique   * mq, martinique, 972   *',
    '* Guyane       * gf, guyane, 974       *',
    '****************************************',
    '',
    'example for the Guadeloupe:',
    'vigilance.py 971',
    'vigilance.py gp']
    )

    COUNTRY_ALIASES = [ 
        ['IlesduNord', ['idn', 'ilesdunord', 'nord']],
        ['Guadeloupe', ['gp', 'guadeloupe', '971']], 
        ['Martinique',['mq', 'martinique', '972' ]],
        ['Guyane', ['gf', 'guyane', '974']]
    ]    
    
    if len(sys.argv)==1 or sys.argv[1] in ['-h', '--help']:
        print USAGE
    else:
        url_feed_vigilance = URL_FEED_VIGILANCE
        wanted = sys.argv[1].lower()
        vigilance = get_vigilance_levels(url_feed_vigilance)              
        area = [ alias[0] for alias in COUNTRY_ALIASES if wanted in alias[1] ]

        if len(area) > 0 and vigilance.has_key(area[0]):
            result = ''.join([
                vigilance[area[0]], 
                ' (',
                vigilance['updated'],
                ')'
            ])
        else :
            result = ''.join([
                'ERREUR : no data for ', 
                sys.argv[1],
                '\n',
                USAGE
            ])
        print result

def get_vigilance_levels(url_feed_vigilance):
    '''extracts weather vigilance level from the RSS.
    @url_feed_vigilance : RSS feed to parse
     
    The levels are stored in the first item's description :
<item>
<description>
Iles du Nord : vert.
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Guadeloupe : vert.
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Martinique : vert.
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Guyane : vert.
</description>
</item>
The datetime is the item <pubDate> like : <pubDate>Thu, 18 Aug 2011 10:40:00 GMT</pubDate>
    '''
    d = feedparser.parse(url_feed_vigilance)
    vigilance = d['entries'][0].summary
    bruit = [u'\xa0', u'\n', ' ']
    for b in bruit :
        vigilance = vigilance.replace(b, '')
    vigilances = vigilance.split('.')

    vigilance = {}
    # alert level
    for dataz in vigilances:
        if (":" in dataz): 
            data = dataz.split(":")
            area = data[0]
            level = data[1]
            vigilance[area] = level
    # feed date
    vigilance['updated'] = d['entries'][0].updated        
    return vigilance


if __name__ == '__main__':
    main()
    

Remarque:

mon N900 utilise python 2.5.4, ma station utilise python 2.6.6 et la version la plus répandue (genre Ubuntu) est la 2.7.1+...

Hors la méthode pour parser les arguments de la ligne de commande évolue entre ces différentes versions, notamment par le remplacement dans la 2.7 de optparse (deprecated) par argparse

Donc, plutôt que d'écrire des if selon la version, comme ce script n'a besoin que d'un argument pour s'exécuter :

  • -h ou --help pour savoir comment l'utiliser
  • l'alias de la zone dont on veut connaître le niveau de vigilance

j'ai fait un petit système très simple en utilisant sys.argv[1] et un tuple de tuple d'alias.