Calcul durée du jour -lever & coucher du soleil

Bonjour,

Pour lire un fichier de configuration, je conseille configparser configparser — Configuration file parser — Python 3.11.4 documentation.

Remplacer le nom du fichier, des sections et des arguments par des valeurs explicites

  • Le texte du fichier de conf /chemin/fichier.ini

    # Fichier de configuration
    [Section1]
    a=« valeur de a »
    c=15245.122

    [Section2]
    b=10
    d=z

  • Les parties de code du script Python

    # Import
    import configparser
    # Fonctions
    def read_conf ():
    «  »" Chargement du fichier de configuration «  »"
    conf=« /chemin/fichier.ini »
    param = {}
    config = configparser.ConfigParser()
    config.read(conf)
    param[« a »]=config.get(‹ Section1 ›, ‹ a ›)
    param[« b »]=config.get(‹ Section2 ›, ‹ b ›)
    return param
    # Programme
    params=read_conf()
    a = params[« a »]
    b = params[« b »]

    print (a)
    print (b)

Bonne bidouilles
A+

Bon, je m’excuse, mais je n’y arrive pas, voici l’erreur que j’ai:

Traceback (most recent call last):
  File "daylight.py", line 59, in <module>
params=read_conf()
  File "daylight.py", line 51, in read_conf
conf= daylight.cfg
NameError: name 'daylight' is not defined

Ce que j’ai écrit

import configparser
# Fonctions
def read_conf ():
    """ Chargement du fichier de configuration """
    conf= daylight.cfg
    param = {}
    config = configparser.ConfigParser()
    config.read(conf)
    param[latitude]= config.get(cst_locale, latitude)
    param[longitude]=config.get(cst_locale, longitude)
    return param
# Programme
params=read_conf()
latitude = params[latitude]
longitude = params[longitude]

Ce que je ne comprends pas:
tu utilises « param » et ensuite « params » (sans « S » puis avec un « S », pourquoi? « param », c’est ton « conteneur », c’est bien ça?)

note, j’ai préféré utiliser l’extension *.CFG plutôt que *.INI, ça évite que « Wine » (Windows virtuel pour système Linux) ouvre le fichier.

Bonjour,

1 - Pour « NameError: name ‹ daylight › is not defined », il manque les doubles quottes lors de la définition de conf (cf mon exemple)
2 - « param » et « params » sont 2 entités différentes au niveau Python.

  • « param » est un dictionnaire qui contient les clés/valeurs de chaque paramètre interne à la fonction read_conf
  • « params » est le résultat de la fonction read_conf et il contient le dictionnaire param grâce à « return param »
    Au final ils contiennent les mêmes données.
    Pour plus d’explications, se renseigner sur la fonction return dans une fonction et sur la portée des variables dans Python.

A+

Merci, j’ai corrigé, ça fonctionne.

Bonjour à nouveau.

D’autre questions:
1)je n’ai pas réussis à trouver quelle instruction donner pour terminer le programme, j’ai essayé break (mais ça fonctionne que pour « casser » une boucle), « quit() », « exit ». Là, je séche…
2)j’ai réussi à faire accepter des attributs à mon programme, par contre, les chiffres ne sont pas acceptés comme attributs. Donc, j’aimerais bien une idée (si possible) pour pouvoir le commander aussi à partir d’un simple clavier numérique à 20 touches. C’est possible de les piloter comme des claviers téléphoniques SMS peut être? Ou alors, peut être que les écrans LCD + 5 touches pourraient permettre quelque-chose?

Bonjour,

  1. Il n’y a pas d’instruction particulière pour terminer un programme séquentiel, on arrive à la fin et voilà.
    Pour un programme qui tourne en boucle, (while true) on interrompt la boucle avec break.
    Enfin pour gérer un code retour de fin de programme, on peut utiliser sys.exit(n) , il faut penser à importer la bibliothèque sys en début de script.

2)« j’ai réussi à faire accepter des attributs à mon programme ». Comment as-tu fait ? Quelles fonctions ? Quelles instructions? Je ne suis pas sûr de bien comprendre ta demande, je ne voudrait pas t’envoyer sur une fausse piste.

N.B. : Prends un peu de temps pour parcourir les liens donnés dans le topic de « Codeur incrémental et raspberry », ce sont des mines d’infos Python.

A+

  1. Ok, je vais utiliser sys.exit(n) (ouf! sauvé. Le début de ta réponse m’a fait peur :grin: )

  2. et bien si je tape:
    « daylight --manu » le programme m’affiche les résultats
    « daylight --conf » le programme stockera les coordonnées (longitude et latitudes)
    « daylight » « sans rien » le programme fait les calculs et stockera les résultats, pour le programme chargé de calculer la position du soleil (qui servira pour suivre le soleil avec les panneaux solaires) et pour éventuellement d’autres programmes
    +d’autres options, mais je simplifie.

J’ai utilisé « argparse.ArgumentParser() »
il me refuse « –chiffres », « –/chiffres » comme « attributs » (si ça s’appelle comme ça), donc je me demande comment je pourrais modifier les paramètres de fonctionnement de mon régulateur, une fois qu’il sera installé avec un petit écran LCD et un clavier numérique sur USB.

J’étais en train de regarder les livres en téléchargement libre (et légal)
Sujet: Sites FR sur Python
Et je vais me replonger dedans :wink: tout de suite…

Bonjour,

plutôt que d’utilsier cette syntaxe “daylight --chiffre”, appeler l’argement avec une valeur numérique
daylight --valeur n
avec n = un chiffre

Dans le programme ça devrait donner un truc du genre (choisir le type en fonction du type de variable numérique attendue).

parser.add_argument("-v", "--valeur", type=int, dest="chiffre", help="traite chiffre ")

Puis plus loin dans le programme gestion de l’option --valeur en vérifiant si la variable args.chiffre existe alors il affecte cette valeur à la variable chiffre.

   if args.chiffre
      chiffre=args.chiffre

Pas sûr de mon coup à 100% mais ça doit donner une bonne piste…

Edit : Lien sur la Doc en ligne

A+

Bon,j’ai essayé sans réussir, mais je crois que je suis parti sur une mauvaise piste en voulant utiliser des chiffres comme arguments. Je poursuis la mise au point du programme…

Encore besoin d’un petit coup de main sur un détail, apparemment, je n’utilise pas bien les « chemins relatifs ».

J’utilisais cette instruction

if os.path.isfile("daylight.cfg")    

mais cela ne fonctionne plus maintenant que mes fichiers sont « rangés » dans un dossier spécifique, que dois-je faire?

Bonjour,

Si le fichier cfg n’est plus dans le même répertoire, il faut le chemin complet du fichier, non ?

A+

Dans ce cas là, ça serait probable.

Mais mon fichier cfg est toujours dans le même répertoire que le fichier *.py, simplement, ces 2 fichiers ne sont plus dans le répertoire « user » mais dans un dossier commun.

Bonjour,

Peut être qu’il faut aussi lancer le script de ce même répertoire ?

A+

J’ai essayé, mais « c’est pire », sans même que le programme ne s’exécute
j’obtiens une erreur:

        Traceback (most recent call last):
      File "solocalise.py", line 100, in <module>
        params=read_conf()
      File "solocalise.py", line 88, in read_conf
        config = configparser.ConfigParser()
    NameError: name 'configparser' is not defined    

Je crois que le système ne sais plus ou retrouver les fichiers librairies Python si les fichier ne sont pas lancé depuis la racine, puisque cette erreur ne se produit pas si je lance (a travers le terminal Linux) depuis le répertoire racine.

Bonjour,

Peut être aussi un problème d’environnement ? En ligne de commande certaines variables peuvent être chargées et pas avec le lancement automatique.
Quelle commande lance le script ?
Comment se lance le script à partir d’une ligne de commande hors répertoire racine ?

A+

Depuis le terminal (linux/ubuntu), je le lance manuellement comme cela:

python3 regul_sol/solocalise.py --simul --manu    

pour le lancer depuis le dossier:

cd regul_sol
python3 solocalise.py --simul --manu

C’est vrai qu’il y a une particularité sur ma version Linux, python2 est nécessaire au système, pour cette raison le chemin par défaut « python » est python2

Bonjour,

Essayer de la lancer avec les chemins complets.

/usr/bin/python3 /chemin/regul_sol/solocalise.py --simul --manu

A+

J’ai utilisé cette commande, ça ne change rien:

/usr/bin/python3 regul_sol/solocalise.py --simul --manu

Pour le lancer en automatique il faut le chemin complet (à partir de la racine /) pour le nom du programme surtout.
Quelle est l’erreur dans ce cas ?

A+

Je sais pas si on c’est bien compris, mon problème actuellement, ce n’est pas de lancer le programme mais de réussir à vérifier la présence et d’ouvrir le fichier de config quand il n’est pas dans la racine.