72

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

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

ConfigParserを使用してファイルを解析しmyproject.confます。

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

問題は次のとおりです。setup.pyを使用してプロジェクトをインストールすると、構成ファイルは(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での作業)。

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

4

7 に答える 7

46

構成ファイルがどのように機能するかを見たことがありますか?「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
于 2011-09-27T10:54:18.750 に答える
22

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

于 2012-10-06T18:29:52.167 に答える
18

を使用している場合は、非パッケージデータファイルの使用setuptoolsに関する章を参照してください。自分でファイルを探してはいけません。

于 2011-09-27T10:56:49.123 に答える
6

S.Lottの回答を更新します。

現在、このメソッドconfigparser.ConfigParser.readfp()は非推奨です。</ p>

configparser.ConfigParser.read()マルチファイルには直接メソッドを使用できます。

例えば:

import configparser

config = configparser.ConfigParser()

all_config_files = ['/path/to/file1', '/path/to/file2', '/path/to/file3']

config.read(all_config_files)

ノート:

  • 後の設定ファイルの設定オプションは、前の設定ファイルを上書きします。
  • 設定ファイルが存在しない場合、read()それを無視します。
  • 必要なオプションがファイルから読み取る必要がある場合は、read_file()最初に使用してください。

configparser.ConfigParser.read()

于 2020-03-27T02:17:37.157 に答える
2

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

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
于 2011-09-27T10:51:19.933 に答える
2

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

import os.path
config_file = os.path.join(os.path.expanduser("~"), '.myproject')
于 2015-07-09T11:40:16.590 に答える
1

セクション2.7のセットアップスクリプトを作成するためのドキュメント。追加ファイルのインストールについては、次のように述べています。

このdata_filesオプションを使用して、モジュール配布に必要な追加ファイル(構成ファイル、メッセージカタログ、データファイル、前のカテゴリに当てはまらないもの)を指定できます。

于 2020-01-02T20:12:15.990 に答える