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 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.
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.
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?
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.
Ok, je vais utiliser sys.exit(n) (ouf! sauvé. Le début de ta réponse m’a fait peur )
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 tout de suite…
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…
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…
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.
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.
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 ?
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
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.