Question

J'ai ce code python pour ouvrir un fichier .cfg, y écrire et le sauvegarder:

import ConfigParser 

    def get_lock_file():
        cf = ConfigParser.ConfigParser()
        cf.read("svn.lock")
        return cf
    def save_lock_file(configurationParser):
        cf = configurationParser
        config_file = open('svn.lock', 'w')
        cf.write(config_file)
        config_file.close()

Cela vous semble-t-il normal ou manque-t-il quelque chose sur la façon d’ouvrir, d’écrire, de sauvegarder des fichiers? Existe-t-il un moyen plus standard de lire et d’écrire des fichiers de configuration?

Je demande parce que j'ai deux méthodes qui semblent faire la même chose, elles obtiennent le descripteur de fichier de configuration ('cf'), appelez cf.set ('blah', 'barre' foo '), puis utilisez le fichier save_lock_file (cf) appel ci-dessus. Pour une méthode, cela fonctionne et pour l’autre, l’écriture n’a jamais lieu, on ne sait pas pourquoi à ce stade.

def used_like_this():
        cf = get_lock_file()
        cf.set('some_prop_section', 'some_prop', 'some_value')
        save_lock_file(cf)
Était-ce utile?

La solution

Il suffit de noter que la gestion des fichiers de configuration est plus simple avec ConfigObj.

Pour lire puis écrire un fichier de configuration:

from configobj import ConfigObj
config = ConfigObj(filename)

value = config['entry']
config['entry'] = newvalue
config.write()

Autres conseils

Ça me va.

Si les deux endroits appellent get_lock_file , cf.set (...) , puis save_lock_file , et aucune exception n'est déclenchée, cela devrait fonctionner.

Si vous avez différents threads ou processus accédant au même fichier, vous pouvez avoir une condition de concurrence:

  1. thread / process A lit le fichier
  2. le thread / processus B lit le fichier
  3. thread / process A met à jour le fichier
  4. thread / process B met à jour le fichier

Le fichier ne contient plus que les mises à jour de B, pas celles de A.

De plus, pour écrire des fichiers en toute sécurité, n'oubliez pas l'instruction with (Python 2.5 et versions ultérieures), cela vous épargnera un essai / enfin (que vous devriez utiliser si vous êtes ne pas utiliser avec ). Depuis la documentation de ConfigParser :

with open('example.cfg', 'wb') as configfile:
  config.write(configfile)

Fonctionne pour moi.

C:\temp>type svn.lock
[some_prop_section]
Hello=World

C:\temp>python
ActivePython 2.6.2.2 (ActiveState Software Inc.) based on
Python 2.6.2 (r262:71600, Apr 21 2009, 15:05:37) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ConfigParser
>>> def get_lock_file():
...         cf = ConfigParser.ConfigParser()
...         cf.read("svn.lock")
...         return cf
...
>>> def save_lock_file(configurationParser):
...         cf = configurationParser
...         config_file = open('svn.lock', 'w')
...         cf.write(config_file)
...         config_file.close()
...
>>> def used_like_this():
...         cf = get_lock_file()
...         cf.set('some_prop_section', 'some_prop', 'some_value')
...         save_lock_file(cf)
...
>>> used_like_this()
>>> ^Z


C:\temp>type svn.lock
[some_prop_section]
hello = World
some_prop = some_value


C:\temp>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top