72055


config.ini を以下のように書いて

[code]

    [DEFAULT]
    env = development
    
    [s3]
    bucket = serverlogs.%(env)
    prefix = logs/
    
[/code]

以下のような同じディレクトリの Python スクリプトから読み出したところ

[code]

    import configparser
    config = configparser.ConfigParser()
    config.read(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'config.ini'), encoding='utf-8')
    bucket = config['s3']['bucket']
    
[/code]

以下のエラーになります

[code]

    configparser.InterpolationSyntaxError: bad interpolation variable reference '%(env)'
    
[/code]

<https://docs.python.org/ja/3/library/configparser.html#configparser.BasicInterpolation>  
このドキュメントを見ながら書いてるんですが  
最初のクイックスタートは `=` で書かれているのに  
変数展開のところは `:` のサンプルしかなくて `=` で書く場合は変数展開ができないのでしょうか？


CC BY-SA 4.0
2020-11-19T04:13:35.257
72054
2020-11-19T11:15:48.087
2020-11-19T05:22:32.107
3060
question
python
config parser の変数参照の書き方


`env`が他のセクションの物だからでしょう。

[class
configparser.ExtendedInterpolation](https://docs.python.org/ja/3/library/configparser.html#configparser.ExtendedInterpolation)を追加して、

[code]

    import os
    import configparser
    config = configparser.ConfigParser()
    
    config._interpolation = configparser.ExtendedInterpolation()  #### 追加
    
    config.read(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'config.ini'), encoding='utf-8')
    bucket = config['s3']['bucket']
    
[/code]

追加方法はこちらの1行としてパラメータ指定でも良いようです。

[code]

    config = configparser.ConfigParser(interpolation=configparser.ExtendedInterpolation())
    
[/code]

iniファイルの方は

[code]

    bucket = serverlogs.${DEFAULT:env}
    
[/code]

と書く必要があると思います。

> 他のセクションから値を持ってくることもできます:
[code]

>     [Common]
>     home_dir: /Users
>     library_dir: /Library
>     system_dir: /System
>     macports_dir: /opt/local
>  
>     [Frameworks]
>     Python: 3.2
>     path: ${Common:system_dir}/Library/Frameworks/
>  
>     [Arthur]
>     nickname: Two Sheds
>     last_name: Jackson
>     my_dir: ${Common:home_dir}/twosheds
>     my_pictures: ${my_dir}/Pictures
>     python_dir: ${Frameworks:path}/Python/Versions/${Frameworks:Python}
>  
[/code]


CC BY-SA 4.0
2020-11-19T04:37:44.413
72055
2020-11-19T04:50:42.290
2020-11-19T04:50:42.290
26370
26370
72054
answer


エラーは、「`%(env)`」だからです。「`%(env)s`」(後ろに「s」を付ける)にするとエラーがなくなります。

[code]

    >>> import configparser
    >>> parser = configparser.ConfigParser()
    >>> parser.read_string('''
    ... [DEFAULT]
    ... env = development
    ... 
    ... [s3]
    ... bucket = serverlogs.%(env)s
    ... ''')
    >>> parser['s3']['bucket']
    'serverlogs.development'
    >>> 
    
[/code]


CC BY-SA 4.0
2020-11-19T11:15:48.087
72071
2020-11-19T11:15:48.087
15473
72054
answer