0

これが基本的な質問である場合は申し訳ありませんが、ここまたは Google で答えが見つからないようです。基本的に、Python アプリケーションにインポートされた他のすべてのモジュールで使用できる単一の構成モジュールを作成しようとしています。もちろんimport config、各ファイルにある場合は機能しますが、アプリケーションが実行されている環境に基づいて構成を動的にしたいと考えており、ロジックをすべてのファイルにコピーする必要はありません。

次に例を示します。

app.py:

import config
import submodule

# do other stuff

サブモジュール.py:

print config.some_config_variable

configしかしもちろん、Pythonはそれが定義されていないと不平を言います。

グローバル変数に関するものをいくつか見つけましたが、それも機能していないようです。これが私が試したことです:

編集これを変更して、インポートされる実際の構成を動的にしたいことを示しました。ただし、現在、グローバルにインポートする方法を理解し、そのロジックについて心配するためだけに、テスト用の静的構成モジュールを持っています

app.py

# logic here that defines some_dynamic_config
global config
config = __import__(some_dynamic_config)
import submodule

submodule.py

print config.some_config_variable

しかし、構成はまだ定義されていません。

単一の config.py を作成し、ロジックを配置して変数を設定できることは承知していますが、それは嫌いです。構成ファイルは構成だけで、多くのロジックは含まれていません。

4

2 に答える 2

3

ロジックをどこかに配置する必要があります。次のconfig.pyように、ロードする構成ファイルを決定するモジュールである可能性があります。

#config.py

import sys

from common_config import *

if sys.platform == 'darwin':
    from mac_config import *
elif sys.platform == 'win32':
    from win32_config import *
else:
    from linux_config import *

このアプローチでは、common_settings.pyに共通の設定を配置し、それぞれのファイルにプラットフォーム固有の設定を配置できます。プラットフォーム固有の設定はcommon_settingsの後にインポートされるため、プラットフォーム固有のファイルで再度定義することにより、common_settings内のすべてをオーバーライドすることもできます。

これはDjango設定ファイルで使用される一般的なパターンであり、そこで非常にうまく機能します。

import必要に応じて、各呼び出しをtry... except ImportError:ブロックでラップすることもできます。

于 2012-07-30T22:20:29.957 に答える
1

モジュールは共有されているため、各モジュールはimport config問題なく使用できます。

config.py 自体は、好きなようにグローバル変数を設定するロジックを持つことができます。例として:

config.py:

import sys
if sys.platform == "win32":
    temp = "c:\\temp"
else:
    temp = "/tmp"

任意のモジュールに構成をインポートして使用します。

import config
print "Using tmp dir: %s" % config.temp

何よりも先に初期化されることがわかっているモジュールがある場合は、空の config.py を作成し、それを外部で設定できます。

import config
config.temp = "c:\\temp"

ただし、このコードを使用する前に、このコードを実行する必要があります。空のモジュールはシングルトンとして使用できます。

于 2012-07-30T21:47:34.693 に答える