7
votes

Chargement d'un fichier de configuration du système de fonctionnement Place indépendante à Python

Sous Linux, j'ai mis mes configurations dans "~ / .pogramname". Où devrais-je le placer dans Windows? Quelle serait la manière recommandée d'ouvrir le système d'exploitation de fichier de configuration indépendant à Python?

merci! Nathan


0 commentaires

5 Réponses :


5
votes

Essayez: xxx pré>

sur Linux, cela retournera: p> xxx pré>

sous Windows Cela retournera: P>

>>> import os
>>> os.path.join(os.path.expanduser('~'), '.programname')
'C:\\Documents and Settings\\user\\.programname'


1 commentaires

"Ce qui est un peu laids [.]" Fonctionne bien, cependant.



0
votes

Généralement, les fichiers de configuration et de données pour les programmes sous Windows vont dans le répertoire% Appdata% (ou sont censés), généralement dans un sous-répertoire avec le nom du programme. "% Appdata%", bien sûr, est juste une variable d'environnement qui correspond au dossier de données d'application de l'utilisateur actuel. Je ne sais pas si cela existe sur Linux (bien que je suppose que cela ne le suppose pas), afin de le faire à travers les plates-formes (Windows / Linux / MacOS) ...

import os

if 'APPDATA' in os.environ.keys():
   envar = 'APPDATA'
else:
   envar = 'HOME'

configpath = os.path.join(os.environ[envar], '.programname')


0 commentaires

13
votes

Sous Windows, vous le stockez dans OS.Environ ['AppData'] . Sur Linux, cependant, il est maintenant recommandé de stocker des fichiers de configuration dans os.environ ['xdg_config_home'] , qui par défaut à ~ / .config . Ainsi, par exemple, bâtir sur l'exemple de JAB: xxx

La norme de répertoire de base XDG a été créée afin que la configuration puisse toutes être conservée au même endroit sans encombrer votre répertoire de maison avec des dotfiles. La plupart des nouvelles applications Linux le supportent.


1 commentaires

Ceci est une réponse vraiment multiplate-forme!



7
votes

Quelques améliorations sur La bonne réponse du leadStorm :

Code peut être plus simple en utilisant os.environ.get () code> et court-circuit ou code>: p> xxx pré>

en outre, si vous êtes prêt à utiliser les bibliothèques externes, xdg code> package peut rendre les choses encore plus faciles sur Linux et Mac: P>

if 'APPDATA' in os.environ:
    configpath = os.path.join(os.environ['APPDATA'], "programname")
    os.makedirs(configpath, exist_ok=True)
else:
    configpath = xdg.save_config_path("programname")


5 commentaires

Le OS.Makedirs (configPath, exige_ok = true) fonctionne simplement sous PY3. py2: sinon os.path.exists (configpath): OS.Makedirs (configpath)


@greeeeeeen: Pour Py2, je recommanderais un ESSAYER / SAUF Block autour de Os.Makedirs Pour éviter une condition de course, dans True Pythonic EAFP esprit


Je pense que ce n'est pas un cas EAFP ... Si vous parlez de pythonie, je pense que la construction si la construction est "explicite est meilleure que le guide implicite".


@greeeeeeen: Test si Dir existe et alors Création est Motif lbyl et peut conduire à conditions de course si le répertoire est créé après la si et avant OS.Makedirs () . Très improbable, mais c'est une bonne pratique pour éviter les modèles racés chaque fois que nous le pouvons. Et, dans ce cas, EAFP est également plus rapide . Quant à la "explicitation", IMHO essayant directement de créer et de gérer toutes les erreurs est encore plus explicite.


Bon point. Il serait donc préférable d'adapter la mise en œuvre de l'OS.Makedir de Python 3 dans ce cas. Là, ils utilisent un try-sauf sauf que vous avez suggéré. Github.com/python/cpython/blob/...



1
votes

Mon approche lors de l'utilisation de la bibliothèque Pathlib de Python:

config = environ.get('APPDATA') or environ.get('XDG_CONFIG_HOME')
config = Path(config) if config else Path.home() / ".config"


0 commentaires