Page 1 sur 1

[Python] Regrouper vos infos de configuration dans fichier de config

Publié : 04 janv. 2015, 11:45
par Jose
Bonjour à tous,

Si tout comme moi vous commencez à avoir un certain nombre de scripts python, vous vous êtes aperçu que certains éléments de configuration doivent être saisi à chaque fois. Vous retrouvez l'adresse du serveur domoticz, son port éventuellement les identifiants et mot de passe.

Imaginez le travail de retouche des scripts si vous étiez contraint de changer d'adresse IP ou de port. De plus, en cas de changement de valeur d'IDX (suppression d'un dispositif), il faut également modifier les valeurs.

Pour pallier à cela, j'utilise depuis peu un fichier de configuration qui regroupe toutes les informations importantes. Ce fichier est importé comme module dans le script, un peu à la manière d'un include en PHP. J'ai fait l'essai sur des scripts python mais j'imagine que cela doit être possible également dans les autres langages.

1ere chose à faire, le fichier de configuration "config.py":

Code : Tout sélectionner

pi@srv-domoticz ~/domoticz/scripts/python/tts $ nano config.py
Dans ce fichier, saisissez toutes les informations nécessaires au fonctionnement de vos scripts

Code : Tout sélectionner

#!/usr/bin/python
# -*-coding:Utf-8 -*
# Fichier de configuration pour scripts python
# José - Janvier 2015

# Module conentenant toutes les variables Karotz
karotz_ip='192.168.10.113'
karotz_voip='alice'

# Phrases types
texte_lu='Je viens de relever la température '
texte_liaison=' .Il y fait '
texte_fin='degrés.'

# Module contenant toutes les variables Domoticz
domoticz_ip='192.168.10.120'
domoticz_port='8080'
domoticz_ident='XXXXX'
domoticz_passwd='ZZZZZ'
2eme chose, importez le module "config" dans vos scripts. Exemple d'un script pour Karotz (non complet).

Code : Tout sélectionner

#!/usr/bin/python
# -*-coding:Utf-8 -*
# José - Janvier 2015 - Module d'envoi d'URL sur Karotz

import urllib
import urllib2
import sys
import config

# Module de lecture universel basé sur le fichier config.py
# les agruments se passent directement via le programme display=sys.argv[1]
display = sys.argv[1]

# Condition qui pemet d'adapter le message
if display == '1':
   texte_lu = config.txt_alerte1
   # Change la couleur du Karotz en cas de problème de température
   the_url= 'http://'+config.karotz_ip+'/cgi-bin/leds?pulse=1&color=ff0000&speed=200&color2=000000'
   req = urllib2.Request(the_url)
   handle = urllib2.urlopen(req)

# Analyse et transmssion des messages classiques
if display == '2': texte_lu = config.txt_bonne_journee
Modifiez une fois pour toute votre script en faisant précéder le nom du module à la variable.
Exemple config.karotz_ip (karotz_ip correspondant à la valeur fixée dans le fichier de configuration)

Autre exemple avec domoticz (extrait du script z-wave de Patrice) :

Code : Tout sélectionner

def maj_widget(texte_recup):
    requete='http://'+config.domoticz_ip+':'+config.domoticz_port+json_url_text1+idx_widget_texte+json_url_text2+texte_recup
    r=requests.get (requete)
Précision importante:
Le module de configuration doit impérativement se trouver dans le même répertoire que le script lui même.

Bonne lecture. ;)

José

Re: [Python] Regrouper vos infos de configuration dans fichier de config

Publié : 04 janv. 2015, 15:34
par mike913
Bonjour

Il y a aussi une autre possibilité: les fichiers de configuration de type ini qui ont l' avantage de pouvoir être utilisé à la fois par des scripts python et de scripts php.
exemple de fichier /home/pi/config/conf.ini

Code : Tout sélectionner

[karotz]
ip='192.168.10.113'
voip='alice'

# Phrases types
[texte]
lu='Je viens de relever la température '
liaison=' .Il y fait '
fin='degrés.'

# Module contenant toutes les variables Domoticz
[domoticz]
ip='192.168.10.120'
port='8080'
ident='XXXXX'
passwd='ZZZZZ'
exemple d'utilisation en python:

Code : Tout sélectionner

#!/usr/bin/env python
# coding=UTF-8
# =====================================
# import des modules
import serial
import datetime
import time
import struct
import sys
import os
import ConfigParser
# ----------------------------------------------------------------------------
# Lit la configuration
# ----------------------------------------------------------------------------
def Get_Config(configfile):
	cfg = ConfigParser.ConfigParser()
	cfg.read(configfile)
	return cfg	
# ----------------------------------------------------------------------------
# Ecrit dans le fichier de configuration
# ----------------------------------------------------------------------------
def Set_Config(configfile, cfg):
	with open(configfile, 'wb') as config:
		cfg.write(config)
#-------------------------------------------
#   Boucle principale
#-------------------------------------------
Config = ConfigParser.ConfigParser()
Config.read('/home/pi/config/conf.ini')
print Config.sections()
print Config.options('karotz')
options = Config.options('domoticz')
for option in options:
	try:
		print Config.get('domoticz', option)
	except:
		print("exception on %s!" % option)
et en php:

Code : Tout sélectionner

<?php
$cfgini = parse_ini_file ("/home/pi/config/conf.ini",TRUE);
print_r ($cfgini);
print_r ($cfgini['karotz']);
echo $cfgini['domoticz']['ip'];
?>

Re: [Python] Regrouper vos infos de configuration dans fichier de config

Publié : 04 janv. 2015, 18:22
par Jose
Bonjour Mike913,

Je prends bonne note de ton complément d'info.

José