2012-05-17 7 views
7

Pracuję nad programem w Pythonie dla Windows i chciałbym zapisać zmienne i preferencje użytkownika, aby móc je przywołać nawet po zakończeniu i ponownym uruchomieniu programu .Jak przechowywać zmienne/preferencje w Pythonie do późniejszego wykorzystania

Czy istnieje idealny sposób na wykonanie tej czynności na komputerach z systemem Windows? Czy _winreg i rejestr systemu Windows będą odpowiednie do tego zadania? Czy muszę utworzyć własną bazę danych?

Odpowiedz

3

Zazwyczaj będziesz chciał przechowywać go w folderze konfiguracyjnym w folderze "home". To proste w systemach * nix, trudniejszych w oknach, ponieważ faktycznie trzeba pobrać katalog "danych aplikacji". To zazwyczaj działa na mnie:

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("~")) 

Po masz homeDirectory, należy utworzyć folder o nazwie po projekcie:

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

Następnie można stworzyć plik konfiguracyjny w tym folderze i pisać swoje możliwości do tego w wybranym przez ciebie formacie (mój osobisty ulubiony jest w XML).

+0

Czy "os.path.expanduser" nie działa wszędzie? Po co pisać więcej kodu? –

+0

Po prostu używając expanduser nie dostaniesz folderu danych aplikacji, który różni się w zależności od tego, czy korzystasz z WinXP czy Win7. W ten sposób otrzymasz katalog danych aplikacji niezależnie od systemu operacyjnego Windows. – Josiah

+1

Wiele aplikacji Pythona w systemie Windows umieszcza dane w twoim katalogu domowym, a nie w jego podkatalogu dla danych aplikacji. Uważam to za idealne, ponieważ zachowanie jest takie samo w systemach Windows i Linux. (Python, TortoiseHG i cała gama innych aplikacji w języku Python.) –

4

Chyba że czegoś brakuje, regex nie ma nic wspólnego z rejestrem Windows, po prostu przechowuj gdzieś plik konfiguracyjny, taki jak katalog domowy użytkownika itp. Przynajmniej to, co robiłbym na Linuksie. gdzieś w ~/.config/

+0

Przepraszam, miałem na myśli '_winreg'. Naprawiony! – Parker

1

Jeśli chcesz przechowywać zaledwie par klucz-wartość preferencji, zrób to w pliku konfiguracyjnym tekst. Jeśli chcesz przechowywać struktur Pythonie zrobić z pickle lub shelve. Jeśli potrzebujesz lekkiego, bezproblemowego korzystania z rdbms, użyj sqlite.

.
1

Podczas gdy moduł pickle jest oczywistym wyborem, pliki, które zapisuje, będą nieczytelne dla ludzi. W przypadku plików konfiguracyjnych dobrze byłoby, gdyby plik konfiguracyjny był prostym formatem tekstowym, który użytkownicy mogą przeczytać lub nawet edytować. Zalecam więc użycie modułu JSON i json.

+1

Program ConfigParser czyta i zapisuje pliki wyglądające jak pliki INI i jest również wbudowany. JSON jest świetny dla> 2 poziomów hierarchii wartości klucza i wartości. –

+0

@WarrenP, Ostatnio dużo korzystałem z JSON i wydaje mi się, że stało się to moim nowym formatem! Ale nie mogę dyskutować przeciwko używaniu 'ConfigParser' dla plików konfiguracyjnych; dobry pomysł. – steveha

6

python2 ma ConfigParser, który jest ConfigParser w Python3:

import ConfigParser, os 

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

Nawet na oknach, należy mieć świadomość, że rejestr jest nędzny ula z szumowin i łajdactwa, i że nie powinno się go używać do przechowywania konfiguracji aplikacji Pythona.

+4

"powinieneś zdawać sobie sprawę z tego, że rejestr jest nieszczęsnym ulemem szumowin i podłości" To jest najważniejsza rzecz, którą powinieneś wziąć z tego całego pytania. – Falmarri

+0

Dziękujemy!Od dawna nie korzystałem z systemu Windows i nigdy nie byłem całkiem pewien ogólnego widoku rejestru. Będę pewien, że będę go unikać, jeśli będę mógł – Parker

1

Istnieje kilka sposobów, podzielony jest na dwa główne kierunki

  • dostęp do rejestru systemu Windows z modułem _winreg.

Użycie rejestru uniemożliwia przeniesienie ustawień do innej maszyny lub sprawdzenie ich lub utworzenie kopii zapasowej; do tego trzeba użyć regedit.

W inny sposób zapisz preferencje w pliku w folderze "Moje dokumenty" użytkownika. Ułatwia to przeniesienie ustawień do innego komputera lub użytkownika i nie miesza ustawień twojego programu z ustawieniami wielu innych aplikacji. Więc rzeczy takie jak ich tworzenie i przywracanie są łatwiejsze; po prostu skopiuj jeden plik. Jeśli wybierzesz format tekstu, łatwiej będzie również sprawdzić i usunąć ustawienia.

  • Ustaw swoje ustawienia na liście, krotce lub słowniku i zapisz je za pomocą modułu cPickle. Jest to prawdopodobnie jedna z najprostszych metod. Z drugiej strony, podczas gdy marynowane dane używają formatu ASCII domyślnie, nie jest to czytelne dla człowieka.
  • Użyj modułu ConfigParser, aby zapisać i załadować pliki konfiguracyjne w podobnej strukturze, co pliki Windows '.ini. Pliki te można odczytać przez człowieka.
  • Użyj modułu json do przechowywania ustawień w formacie json. Pliki te można odczytać przez człowieka.
  • Zapisz preferencje jako wyrażenia w języku Python do pliku tekstowego, załaduj go za pomocą execfile(). N.B. Może to zostać wykorzystane do wykonania niepożądanego kodu, więc istnieją względy bezpieczeństwa. Ale z drugiej strony jest to bardzo łatwe i czytelne.
Powiązane problemy