파이썬에서 설정 파일을 사용하는 가장 좋은 방법은 무엇입니까? [닫은]


332

많은 인수로 실행되는 명령 줄 스크립트가 있습니다. 나는 이제 너무 많은 논증이있는 지점에 왔으며, 사전 형식의 논증도 갖고 싶다.

따라서 작업을 단순화하기 위해 설정 파일을 사용하여 스크립트를 실행하고 싶습니다. 파일 구문 분석에 어떤 라이브러리를 사용해야하는지 잘 모르겠습니다. 가장 좋은 방법은 무엇입니까? 나는 물론 무언가를 망치는 것이 가능하지만, 이것에 대한 라이브러리가 있다면 나는 모두 귀입니다.

몇 가지 '요구 사항':

  • 사용하기보다는 pickle쉽게 읽고 편집 할 수있는 간단한 텍스트 파일 이길 바랍니다.
  • 사전과 같은 데이터를 추가 할 수 있기를 원합니다. 즉, 어떤 형태의 중첩이 지원되어야합니다.

단순화 된 의사 예제 파일 :

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

6
이 예제 파일의 특정 구문은 실제로 YAML입니다. Benson의 답변을 확인하십시오.
Skippy le Grand Gourou

답변:


231

config.py와 같은 일반적인 파이썬 모듈을 가질 수 있습니다 :

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

다음과 같이 사용하십시오.

import config
print config.truck['color']  

69
권한이 적은 사용자가 구성 파일 만 변경할 수 있도록하려면 권한이없는 코드에 몰래 들어가도록 허용하는 것이 좋습니다.
nikolay 2016 년

172
"권한이 낮은"사용자가보다 권한이있는 프로그램에 대한 구성을 변경하도록 허용하는 것은 아마도 의심스러운 설정일 것입니다.
XTL

18
py2app와 같은 도구를 사용하여 배포하기 위해 프로젝트를 패키징하는 데 문제가 발생할 수도 있습니다. 구성 파일이 배포되면 앱의 서명이 무효화되므로 사용자가 구성 파일을 편집하지 못할 수 있습니다.
bschwagg

18
이것의 주된 단점은 .py파일이 실행 가능하므로를 통해 구성을로드하려고 시도하는 동안 모든 종류의 코드를 실행할 수 있다는 것 import입니다. 보안 관점에서는 용납 할 수 없습니다.
Apalala

5
이 버전을 안전하게 사용할 수 없습니까 ast.literal_eval? docs.python.org/3/library/ast.html#ast.literal_eval
André C. Andersen

169

제공 한 샘플 구성은 실제로 유효한 YAML 입니다. 실제로 YAML은 모든 요구를 충족하고 많은 언어로 구현되며 매우 인간 친화적입니다. 나는 당신이 그것을 사용하는 것이 좋습니다. PyYAML 프로젝트는 멋진 파이썬 모듈이 구현 YAML을 제공합니다.

yaml 모듈을 사용하는 것은 매우 간단합니다 :

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

3
yaml은 항상 내가 사용하는 것입니다. 형식은 죽은 간단한 것부터 임베디드 파이썬 코드를 지원하는 것에 이르기까지 다양 할 수 있으며 표준 라이브러리는 구문 분석과 위생을 크게 향상시킵니다.
Todor Minakov

15
동의했다. YAML을 작성하는 귀하 또는 사용자를 위해 내가 아는 최고의 YAML 참조가 있습니다. 공식 문서는 불행하게도 그 밖에 구현을 목표로 사양, 아무것도하지만, Eevee의 가이드는 환상적이다.
Esteis

5
우리가 시작하지 않은 경우 pip3 install pyyaml파이썬 스크립트로 가져올 준비가되었습니다.
user8675309

2
yaml은 매우 단순하게 유지하는 경우에만 친숙합니다. 기본적으로 안전하지 않은 기능에는 경계가 있습니다. 기본적으로 안전한 대안으로 hitchdev.com/strictyaml 을 사용해보십시오 .
Gringo Suave

107

가장 유용하고 사용하기 쉬운 https://wiki.python.org/moin/ConfigParserExamples

다음과 같이 "myfile.ini"를 작성하십시오.

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

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

[Others]
Route: 66

그리고 다음과 같은 데이터를 검색하십시오.

>>> 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의 경우 configparser 모듈을 대신 사용하십시오 (모두 소문자)
Roland

2
구현이없고 사용법 만 있기 때문에 솔루션을 구현하는 가장 빠르고 명확하며 가장 쉬운 방법입니다. :) 감사합니다!
Aleksandar

그래도 질문에서 묻는대로 중첩 사전을 지원합니까?
Jakub Bláha

54

Yaml과 Json은 설정 / 구성을 저장하기 위해 가장 단순하고 가장 일반적으로 사용되는 파일 형식입니다. PyYaml을 사용하여 yaml을 구문 분석 할 수 있습니다. Json은 이미 2.5에서 파이썬의 일부입니다. Yaml은 Json의 상위 집합입니다. Json은 이스케이프가 필요한 여러 줄 문자열을 제외한 대부분의 사용 사례를 해결합니다. Yaml도 이러한 경우를 처리합니다.

>>> 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
다소 동등하지만 json은 yaml만큼 사람이 읽을 수있는 것은 아닙니다. 그의 샘플 설정은 실제로 유효한 yaml이므로 json 대신 강조합니다.
벤슨

23
"json.dump (config, fp, sort_keys = True, indent = 4)"를 사용하면 가독성이 향상됩니다.
phobie

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.