Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Gérer un fichier de config pour un jeu python

2 réponses
Avatar
pdorange
Je début avec Python et ce language est vraiment très agréable.

Je réalise un petit jeu d'arcade que je souhaite multi-plateforme
(j'utilise pygame).
Avoir avoir dégrossit le jeu en lui même, je m'occupe des réglages
utilisateurs et mémoire des scores.
Je souhaite fournir une solution Mac, Windows et Linux.
A priori je stocke tout ça dans un fichier de config.

Mes questions, d'ordre général concerne la meilleure façon (ou plus
orthodoxe) de gérer ce fichier.
Sur Mac il est de bon ton de la stocker dans un répertoire spécial de
l'utilisateur courant (/users/xxx/Library/Preferences), avec Windows et
Linux plutot dans un fichier config directement avec le logiciel ?

Mais comment détecter la plateforme et comment appréhender les problèmes
de droits, notamment avec Mac et Linux. Comment retrouver le chemin par
défaut pour chaque OS...

Comment avez vous résolu ce genre de cas ? Qu'elle serait la meilleure
solution.

Merci de toutes pistes.

--
Pierre-Alain Dorange

Vidéo, DV et QuickTime <http://www.garage-video.com/>
Clarus, the DogCow <http://clarus.chez.tiscali.fr/>

2 réponses

Avatar
Bruno Desthuilliers
Pierre-Alain Dorange a écrit :
Je début avec Python et ce language est vraiment très agréable.

Je réalise un petit jeu d'arcade que je souhaite multi-plateforme
(j'utilise pygame).
Avoir avoir dégrossit le jeu en lui même, je m'occupe des réglages
utilisateurs et mémoire des scores.
Je souhaite fournir une solution Mac, Windows et Linux.
A priori je stocke tout ça dans un fichier de config.



Tout dans le même ? les scores et la config ?

Mes questions, d'ordre général concerne la meilleure façon (ou plus
orthodoxe) de gérer ce fichier.
Sur Mac il est de bon ton de la stocker dans un répertoire spécial de
l'utilisateur courant (/users/xxx/Library/Preferences), avec Windows et
Linux plutot dans un fichier config directement avec le logiciel ?



Sous nunux, l'"orthodoxie" consiste à stocker ce genre de choses dans un
fichier ou répertoire "caché" dans le répertoire de l'utilisateur. Un
fichier (ou un répertoire...) est "caché" si son nom commence par un "."
- par exemple, ma config utilisateur pour emacs (mon éditeur de code)
est dans le fichier /home/bruno/.emacs, et toutes les données et prefs
de mon mailer (thunderbird) sont dans le répertoire
/home/bruno/.mozilla-thunderbird.

Mais comment détecter la plateforme



>>> import os
>>> os.name
'posix'
>>> os.uname()
('Linux', 'bruno', '2.6.20-16-386', '#2 Tue Feb 12 05:38:06 UTC 2008',
'i686')
>>>

NB : sous MacOS X, le premier élément du tuple renvoyé par os.uname()
sera 'Darwin'

et comment appréhender les problèmes
de droits, notamment avec Mac et Linux.



D'abord, rappelle-toi que MacOS est un unix aussi. Même si les
conventions de nommage et d'organisation de l'arbo du filesystem sont
parfois différente, sur le fond, le principe reste le même:
- les prefs et autres données de fonctionnement sont stockées dans le
répertoire de l'utilisateur
- l'utilisateur à le droit de lire et écrire dans son répertoire
- le programme s'exécute (par défaut) avec les droits de l'utilisateur
- donc le programme a le droit de lire et écrire dans le répertoire de
l'utilisateur qui l'a lancé.

En bref : *quels* problèmes de droit ?

Comment retrouver le chemin par
défaut pour chaque OS...



Sur un système posix (donc sur MacOS X et linux),
os.path.expanduser('~') te donnera la racine du répertoire de
l'utilisateur courant (celui qui a lancé le programme).

Pour ce qui est de Windows, il faudra demander à quelqu'un d'autre -
perso, je n'utilise pas ça.

Dernier point: si tu débutes avec Python, tu ne le sait peut-être pas,
mais tu peux faire des définitions conditionnelles, au top-level d'un
module ou dans une classe, ie:

import os

if os.name == 'posix':
import my.posix.module as mymodule
def do_this():
print "posix version"
elif os.name == 'nt':
import my.nt.module as mymodule
def do_this():
print "nt version"
else:
import my.wtf.module as mymodule
def do_this():
print "WTF ???"

class Foo(object):
if os.name == 'posix':
def my_method(self):
print "yo posix"
elif os.name == 'nt':
def my_method(self):
print "yay nt"
else:
def my_method(self):
print "yup WTF"


if os.name=="posix":
class Bar(object):
# posix implementation

elif os.name=="nt":
class Bar(object):
# nt implementation

else:
class Bar(object):
# whatever implementation

etc...
Avatar
Méta-MCI \(MVP\)
Bonsoir !

Sous Windows, pour connaitre le "répertoire de l'utilisateur" :

os.environ['USERPROFILE']

@-salutations
--
Michel Claveau