web-dev-qa-db-ja.com

Pythonで構成ファイルを配置する場所

開発モードでは、次のディレクトリツリーがあります。

| my_project/
| setup.py
| my_project/
    | __init__.py
    | main.py
    | conf/
        | myproject.conf

ConfigParser を使用して、myproject.confファイル。

私のコードでは、良いパスでファイルをロードするのは簡単です:my_project/conf/myproject.conf

問題は次のとおりです。setup.pyを使用してプロジェクトをインストールすると、構成ファイルが/etc/my_project/myproject.conf/usr/lib/python<version>/site-packages/my_project/

my_project/conf/myproject.conf「本番」モードのプロジェクトのファイル。ローカルファイル(my_project/conf/myproject.conf)「開発」モード。

さらに、可能な場合はポータブルにしたいと思います(たとえば、Windowsで作業します)。

それを行うための良い習慣は何ですか?

53
Sandro Munda

構成ファイルがどのように機能するかを見ましたか? 「rc」ファイルは、時々呼ばれるので読んでください。 「bashrc」、「vimrc」など.

通常、構成ファイルのマルチステップ検索があります。

  1. ローカルディレクトリ。 ./myproject.conf

  2. ユーザーのホームディレクトリ(~user/myproject.conf

  3. 標準のシステム全体のディレクトリ(/etc/myproject/myproject.conf

  4. 環境変数(MYPROJECT_CONF

Pythonインストールは最後に見る場所です。

config= None
for loc in os.curdir, os.path.expanduser("~"), "/etc/myproject", os.environ.get("MYPROJECT_CONF"):
    try: 
        with open(os.path.join(loc,"myproject.conf")) as source:
            config.readfp( source )
    except IOError:
        pass
37
S.Lott

appdirs パッケージは、さまざまなプラットフォームにインストールされたアプリの標準的な場所を見つける上で素晴らしい仕事をします。開発者に何らかの「アンインストール済み」ステータスを検出または許可するように拡張するのが理にかなっているのだろうか。

15
nealmcb

setuptoolsを使用している場合は、 非パッケージデータファイルを使用 の章を参照してください。自分でファイルを検索しようとしないでください。

14
patrys

もう1つのオプションは、すべての.cfgおよび.iniファイルをホームディレクトリに保持することです(「boto」と同様)。

import os.path
config_file = os.path.join(os.path.expanduser("~"), '.myproject')
2
tashuhka

私はそれに対処するためのきれいな方法があるとは思わない。開発モードで動作する「ローカル」ファイルの存在をテストすることを選択できます。それ以外の場合は、本番パスにフォールバックします。

import os.path

main_base = os.path.dirname(__file__)
config_file = os.path.join(main_base, "conf", "myproject.conf")

if not os.path.exists(config_file):
    config_file = PROD_CONFIG_FILE   # this could also be different based on the OS
1
Rodrigue