2012-05-17 15 views
7

Python for Windows'ta bir program üzerinde çalışıyorum ve programın sonlandırılıp yeniden başlatılmasından sonra bile bunları geri çağırmak için değişkenleri ve kullanıcı tercihlerini kaydetmek istiyorum .Python'da değişkenler/tercihler daha sonra kullanmak üzere nasıl saklanır

Windows makinelerinde bunu yapmak için ideal bir yol var mı? Bu görev için _winreg ve Windows kayıt defteri uygun mu? Ya da kendi veritabanımın bir çeşitini oluşturmam gerekiyor mu?

cevap

3

Genellikle "home" klasöründeki bir yapılandırma klasöründe saklamak isteyeceksiniz. * Nix sistemlerinde daha kolay, pencerelerde daha zor, çünkü aslında "uygulama verileri" dizini almanız gerekiyor. Bu genellikle benim için çalışıyor:

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

Sonra o klasördeki bir yapılandırma dosyası yapmak ve seçenekleri yazabilirsiniz: Eğer GirişDizini aldıktan sonra

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

, projeniz adında bir klasör oluşturmanız gerekir sizin seçtiğiniz biçimde (kişisel favorim bir XML'de).

+0

"os.path.expanduser" her yerde çalışmıyor mu? Neden daha fazla kod yazmalı? –

+0

Sadece expanduser kullanmanız, winXP veya win7 üzerinde olmanıza bağlı olarak farklı olan uygulama veri klasörünü almaz. Bunu yaptığınızda, Windows işletim sisteminizden bağımsız olarak uygulama veri dizini alırsınız. – Josiah

+1

Windows'daki pek çok Python uygulaması, uygulama verileri için alt dizininde değil, ana klasörünüze veri koyar. Bu ideali buluyorum, çünkü davranış Windows ve Linux'ta aynı. (Python, TortoiseHG ve diğer Python uygulamalarının tümüyle bir uzantısıdır.) –

4

Bir şeyi özlemediğim sürece, regex'in windows kayıt defterinde bir ilgisi yoktur. Sadece kullanıcının giriş dizini gibi herhangi bir yerde bir yapılandırma dosyası depolayın. En azından Linux'ta yaptığım şey. yere ~/.config/

+0

Üzgünüz, '_winreg' anlamına geliyordu. Sabit! – Parker

0

bir metin yapılandırma dosyasında bunu, sen tercihlerin sadece anahtar-değer çiftleri saklamak istiyorsanız ben

1

pickle kullanılması önerilir, değişkenleri kaydetmek için. Eğer piton yapıları saklamak istiyorsanız, bunu pickle veya shelve ile. Bir ışığa ihtiyacınız varsa, sorunsuz, rdbms sqlite kullanın.

1

pickle modülü açık bir seçim olsa da, yazdığı dosyalar insan tarafından okunamayacak. Yapılandırma dosyalarınızda, yapılandırma dosyanızın kullanıcılarınızın okuyabileceği veya düzenleyebileceği basit bir metin biçimi olması iyi olur. Bu yüzden JSON ve json modülünü kullanmanızı öneririm.

import ConfigParser, os 

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

bile pencerelerde, kayıt defteri kötülük ve pisliğin sefil kovanı olduğunun farkında olmalı ve bunu kullanarak gerektiğini:

+1

ile ilgili bir tür en iyi uygulamayı kaçırmadığımdan emin olmak istedim. ConfigParser INI dosyaları gibi görünen dosyaları okuyor ve yazıyor. JSON,> 2 seviyedeki anahtar + değer hiyerarşisi için mükemmeldir. –

+0

@WarrenP, Ben çok yakın zamanda JSON kullanıyordum ve sanırım benim go-to formatım oldu! Ancak yapılandırma dosyaları için 'ConfigParser' kullanmanın zor olduğunu söyleyebilirim; İyi bir fikir. – steveha

6

Python2 Python3 içinde ConfigParser olduğu ConfigParser sahiptir python uygulama yapılandırmalarınızı saklamak için

+4

'Kayıt defterinin berbat bir pislik ve kötülük olduğunu biliyor olmalısınız. Bu tüm sorudan almanız gereken en önemli şey budur. – Falmarri

+0

Teşekkürler!Bir süredir yoğun bir şekilde Windows kullanmamıştım ve kayıt defterinin genel görünümünden tam olarak emin değildim, eğer temizleyeceğime emin olacağım – Parker

1

iki ana yön

  • Erişim _winreg modülü ile Windows kayıt devided çeşitli yolları vardır.

Kayıt defterini kullanmak, ayarları başka bir makineye aktarmak veya denetlemek veya denetlemek için önemli değildir; Bunun için regedit'u kullanmanız gerekir.

Diğer yol ise tercihleri ​​bir dosyada kullanıcının 'Belgelerim' klasöründe saklar. Bu, ayarları başka bir makineye veya kullanıcıya taşımayı kolaylaştırır ve programınızın ayarlarını başka bir dizi uygulamanınkilerle karıştırmaz. Yani onları yedekleyip geri yüklemek gibi şeyler daha kolay; sadece bir dosya kopyala. Bir metin formatı seçerseniz, ayarları kontrol etmek ve hata ayıklamak da kolaydır.

  • Ayarlarınızı bir listeye, tuple veya sözlüğüne koyun ve bunları cPickle modülüyle kaydedin. Bu muhtemelen en kolay yöntemlerden biridir. Aşağı yönde, turşu verileri varsayılan olarak bir ASCII formatı kullanırken, insan tarafından okunabilir değildir.
  • Yapılandırma dosyalarını Windows '.ini dosyaları gibi benzer bir yapıya kaydetmek ve yüklemek için ConfigParser modülünü kullanın. Bu dosyalar insan tarafından okunabilir.
  • Ayarları json biçiminde kaydetmek için json modülünü kullanın. Bu dosyalar insan tarafından okunabilir.
  • Tercihleri ​​bir metin dosyasına Python ifadeleri olarak kaydedin, execfile() ile yükleyin. N.B. Bu keyfi kod yürütmek için kullanılabilir, bu yüzden güvenlik hususları vardır. Ancak yukarı doğru, çok kolay ve okunabilir.
İlgili konular