2012-05-17 31 views
7

Ich arbeite an einem Programm in Python für Windows, und möchte Variablen und Benutzereinstellungen speichern, so dass ich sie abrufen kann, auch nachdem das Programm beendet und neu gestartet wurde .So speichern Sie Variablen/Einstellungen in Python für die spätere Verwendung

Gibt es einen idealen Weg, dies auf Windows-Maschinen zu tun? Wäre _winreg und die Windows-Registrierung für diese Aufgabe geeignet? Oder muss ich eine eigene Datenbank erstellen?

Antwort

3

Sie werden es normalerweise in einem Konfigurationsordner im Ordner "home" speichern wollen. Das ist bei * nix-Systemen einfach, in Windows schwieriger, weil Sie eigentlich das Verzeichnis "Anwendungsdaten" benötigen. Dies funktioniert in der Regel für mich:

import os 
if os.name != "posix": 
    from win32com.shell import shellcon, shell 
    homedir = "{}\\".format(shell.SHGetFolderPath(0, shellcon.CSIDL_APPDATA, 0, 0)) 
else: 
    homedir = "{}/".format(os.path.expanduser("~")) 

Nachdem Sie das Home-Verzeichnis haben, sollten Sie einen Ordner nach dem Projekt mit dem Namen erstellen:

if not os.path.isdir("{0}.{1}".format(homedir,projectname)): 
    os.mkdir("{0}.{1}".format(homedir,projectname)) 

Dann können Sie eine Konfigurationsdatei in diesem Ordner machen und Ihre Optionen schreiben dazu im Format Ihrer Wahl (mein persönlicher Favorit ist in einem XML).

+0

Funktioniert 'os.path.expanduser' nicht überall? Warum mehr Code schreiben? –

+0

Wenn Sie nur expanderuser verwenden, erhalten Sie keinen Anwendungsdatenordner, der davon abhängig ist, ob Sie WinXP oder win7 verwenden. Auf diese Weise erhalten Sie unabhängig von Ihrem Windows-Betriebssystem das Anwendungsdatenverzeichnis. – Josiah

+1

Viele Python-Apps unter Windows legen Daten in Ihrem privaten Ordner ab, nicht in ihrem Unterverzeichnis für App-Daten. Ich finde das ideal, weil das Verhalten unter Windows und Linux gleich ist. (Python, TortoiseHG und eine ganze Reihe anderer Python-Apps.) –

4

Sofern ich etwas nicht vermisse, hat regex nichts mit der Windows-Registrierung zu tun. Speichern Sie einfach eine Konfigurationsdatei, wie das Home-Verzeichnis des Benutzers oder was auch immer. Zumindest würde ich das unter Linux tun. Speichern Sie eine Datei irgendwo in ~/.config/

+0

Sorry, ich meinte '_winreg'. Fest! – Parker

1

mit der Wenn Sie nur Schlüssel-Wert-Paare von Einstellungen speichern möchten, ist es in einer Textkonfigurationsdatei tun. Wenn Sie python-Strukturen speichern wollen, es zu tun mit pickle oder shelve. Wenn Sie ein Licht benötigen, stressfrei, RDBMS verwenden sqlite.

1

Während das Modul pickle eine offensichtliche Wahl ist, sind die Dateien, die es schreibt, nicht für Menschen lesbar. Für Konfigurationsdateien wäre es gut, wenn Ihre Konfigurationsdatei ein einfaches Textformat wäre, das Ihre Benutzer lesen oder sogar bearbeiten können. Also, ich empfehle Ihnen, JSON und das json Modul zu verwenden.

+1

ConfigParser liest und schreibt Dateien, die wie INI-Dateien aussehen, und ist auch eingebaut. JSON eignet sich jedoch hervorragend für> 2 Ebenen der Schlüssel + Wert-Hierarchie. –

+0

@WarrenP, Ich habe in letzter Zeit viel JSON verwendet, und ich denke, es ist mein Go-to-Format geworden! Aber ich kann kaum dagegen sprechen, 'ConfigParser' für Konfigurationsdateien zu verwenden; gute Idee. – steveha

6

Python2 hat ConfigParser, der ConfigParser ist, in Python3:

import ConfigParser, os 

config = ConfigParser.ConfigParser() 
config.readfp(open('defaults.cfg')) 
config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')]) 

auch unter Windows, sollten Sie sich bewusst sein, dass die Registrierung ein elender hive von Abschaum und Schurkerei, und dass Sie es nicht verwenden sollten um Ihre Python-App-Konfigurationen zu speichern.

+4

'Sie sollten sich bewusst sein, dass die Registrierung ein erbärmlicher Bienenstock von Abschaum und Schurkerei ist 'Dies ist das Wichtigste, was Sie von dieser ganzen Frage nehmen sollten. – Falmarri

+0

Danke!Ich habe Windows seit einiger Zeit nicht mehr ausgiebig genutzt und war mir der Gesamtansicht der Registry nie ganz sicher. Ich werde mich davon abhalten lassen, wenn ich kann – Parker

1

Es gibt mehrere Möglichkeiten, gliedert sich in zwei Hauptrichtungen

  • Zugriff auf die Windows-Registry mit dem _winreg Modul.
  • Mit der Registrierung ist es nicht trivial, die Einstellungen auf eine andere Maschine zu übertragen oder sie zu überprüfen oder zu sichern; Sie müssten regedit für diese verwenden.

    Die andere Möglichkeit speichern die Einstellungen in einer Datei im Ordner "Eigene Dateien" des Benutzers. Dies erleichtert das Verschieben der Einstellungen auf einen anderen Computer oder Benutzer und vermischt die Einstellungen Ihres Programms nicht mit denen einer Vielzahl anderer Anwendungen. So sind Dinge wie das Sichern und Wiederherstellen einfacher. Sie kopieren nur eine Datei. Wenn Sie ein Textformat auswählen, ist es auch einfacher, die Einstellungen zu überprüfen und zu debuggen.

  • Setzen Sie Ihre Einstellungen in eine Liste, ein Tupel oder ein Wörterbuch und speichern Sie sie mit dem Modul cPickle. Dies ist wahrscheinlich eine der einfachsten Methoden. Auf der anderen Seite, während gebeizte Daten standardmäßig ein ASCII-Format verwenden, ist es nicht lesbar.
  • Verwenden Sie das Modul ConfigParser zum Speichern und Laden von Konfigurationsdateien in einer ähnlichen Struktur wie Windows .ini Dateien. Diese Dateien sind für Menschen lesbar.
  • Verwenden Sie das Modul json zum Speichern von Einstellungen im JSON-Format. Diese Dateien sind für Menschen lesbar.
  • Speichern Sie die Einstellungen als Python-Ausdrücke in eine Textdatei, laden Sie sie mit execfile(). N.B. Dies könnte zum Ausführen von beliebigem Code verwendet werden, daher gibt es Sicherheitsüberlegungen. Aber auf der Oberseite ist es sehr einfach und lesbar.
Verwandte Themen