Python'da bir ayarlar dosyasını kullanmanın en iyi yolu nedir? [kapalı]


332

Birçok argüman ile çalıştırmak bir komut satırı komut dosyası var. Şimdi çok fazla argümanım olduğu bir noktaya geldim ve sözlük formunda da bazı argümanlar almak istiyorum.

Bu yüzden işleri basitleştirmek için betiği bir ayarlar dosyasıyla çalıştırmak istiyorum. Dosyanın ayrıştırılması için hangi kitaplıkların kullanılacağını gerçekten bilmiyorum. Bunu yapmak için en iyi uygulama nedir? Tabii ki kendimi bir şey çıkarabilirim, ama bunun için bir kütüphane varsa, ben kulaklarım.

Birkaç 'talep':

  • Kullanmak yerine pickle, kolayca okunabilen ve düzenlenebilen düz bir metin dosyası olmasını istiyorum.
  • İçine sözlük benzeri veriler ekleyebilmek istiyorum, yani bazı yuvalama biçimleri desteklenmelidir.

Basitleştirilmiş bir sözde örnek dosya:

truck:
    color: blue
    brand: ford
city: new york
cabriolet:
    color: black
    engine:
        cylinders: 8
        placement: mid
    doors: 2

6
Bu örnek dosyanın sözdizimi aslında YAML'dir, Benson'ın yanıtını kontrol edin.
Skippy le Grand Gourou

Yanıtlar:


231

Normal bir Python modülünüz olabilir, örneğin config.py, şöyle:

truck = dict(
    color = 'blue',
    brand = 'ford',
)
city = 'new york'
cabriolet = dict(
    color = 'black',
    engine = dict(
        cylinders = 8,
        placement = 'mid',
    ),
    doors = 2,
)

ve şu şekilde kullanın:

import config
print config.truck['color']  

69
Bu, düşük ayrıcalıklı kullanıcıların yalnızca yapılandırma dosyalarını değiştirmesine izin vermek istiyorsanız, bu şekilde aslında ayrıcalıklı kodda gizlice girmelerine izin vermek gibi oldukça kötü bir fikirdir.
nikolay

172
"Düşük ayrıcalıklı" kullanıcıların daha ayrıcalıklı bir programın yapılandırmasını değiştirmesine izin vermek muhtemelen zaten şüpheli bir kurulumdur.
XTL

18
Ayrıca, projenizi dağıtım için py2app gibi bir araç kullanarak paketleme sorunlarıyla karşılaşabilirsiniz. Kullanıcı, uygulamanın imzasını geçersiz kılacağından yapılandırma dosyasını dağıtıldıktan sonra düzenleyemeyebilir.
bschwagg

18
Bunun ana dezavantajı (aksi takdirde çok uygun bir seçenek) .pydosyaların yürütülebilir olmasıdır, bu yüzden yapılandırmayı yüklemeye çalışırken her türlü kod çalıştırılabilir import. Güvenlik açısından bu kabul edilemez.
Apalala

5
Bunun bir sürümü güvenli bir şekilde yapılamaz ast.literal_evalmı? docs.python.org/3/library/ast.html#ast.literal_eval
André C. Andersen

169

Sağladığınız örnek yapılandırma aslında geçerli YAML . Aslında, YAML tüm taleplerinizi karşılar, çok sayıda dilde uygulanır ve son derece insan dostudur. Bunu kullanmanızı kesinlikle tavsiye ederim. PyYAML proje güzel bir piton modülü, o uygular YAML sağlar.

Yaml modülünü kullanmak son derece basittir:

import yaml
config = yaml.safe_load(open("path/to/config.yml"))

3
yaml her zaman çevirdiğim bir şeydir; biçim gömülü python kodunu desteklemeye kadar basit olabilir ve standart kütüphane sizin için ayrıştırma ve sanitasyonun ağır şekilde kaldırılmasını sağlar.
Todor Minakov

15
Kabul. Siz veya YAML yazan kullanıcılar için işte bildiğim en iyi YAML referansı . Resmi belgeler ne yazık ki başka bir uygulayıcılar amaçlayan Spec ve hiçbir şey, ama eevee rehberi harika.
Esteis

5
Bizim için başlatılmamış, bu pip3 install pyyamlpython komut dosyalarına aktarmaya hazır hale getirmek için.
user8675309

2
Dikkat, yaml sadece çok basit tutarsanız dostudur, varsayılan olarak güvensiz özelliklerle sınırlanan tonlarca sorunlu vardır. Varsayılan olarak güvenli bir lite alternatifi olarak hitchdev.com/strictyaml'yi deneyin .
Gringo Suave

107

Bunu en kullanışlı ve kullanımı kolay buldum https://wiki.python.org/moin/ConfigParserExamples

Sadece bir "myfile.ini" dosyası oluşturursunuz:

[SectionOne]
Status: Single
Name: Derek
Value: Yes
Age: 30
Single: True

[SectionTwo]
FavoriteColor=Green
[SectionThree]
FamilyName: Johnson

[Others]
Route: 66

Ve aşağıdaki gibi verileri alın:

>>> import ConfigParser
>>> Config = ConfigParser.ConfigParser()
>>> Config
<ConfigParser.ConfigParser instance at 0x00BA9B20>
>>> Config.read("myfile.ini")
['c:\\tomorrow.ini']
>>> Config.sections()
['Others', 'SectionThree', 'SectionOne', 'SectionTwo']
>>> Config.options('SectionOne')
['Status', 'Name', 'Value', 'Age', 'Single']
>>> Config.get('SectionOne', 'Status')
'Single'

20
Python 3 için bunun yerine yapılandırma modülünü kullanın (tümü küçük harf)
Roland

2
Bu, uygulanması en hızlı, en açık ve en kolay çözümdür, çünkü uygulama yoktur, sadece kullanım vardır. :) Teşekkür ederim!
Aleksandar

Yine de bu soruda sorulduğu gibi iç içe sözlükleri destekleyebilir mi?
Jakub Bláha

54

Yaml ve Json, ayarları / yapılandırmayı saklamak için en basit ve en yaygın kullanılan dosya formatlarıdır. PyYaml yaml'i ayrıştırmak için kullanılabilir. Json 2.5'ten beri python'un bir parçası. Yaml, Json'un bir üst kümesidir. Json, kaçmanın gerekli olduğu çok satırlı dizeler dışında çoğu kullanım durumunu çözecektir. Yaml bu davaları da halleder.

>>> import json
>>> config = {'handler' : 'adminhandler.py', 'timeoutsec' : 5 }
>>> json.dump(config, open('/tmp/config.json', 'w'))
>>> json.load(open('/tmp/config.json'))   
{u'handler': u'adminhandler.py', u'timeoutsec': 5}

13
Daha fazla veya daha az eşdeğer olsa da, json neredeyse yaml kadar okunabilir değildir. Onun örnek yapılandırma aslında geçerli yaml olduğundan, json yerine bunu vurgulamak istiyorum.
Benson

23
"Json.dump (config, fp, sort_keys = True, indent = 4)" kullanılması okunabilirliği artırır.
phobie

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.