- 要件例
configディレクトリがあり、それを渡す場合はfrom config import XXX
以下の3つのファイルに設定されている変数を参照することができます。
- 目標
次のような結果が必要です。
In [2]: 構成インポート A、DD、CC から
In [3]: A
Out[3]: 1
-
エラーのデモンストレーション
現在の直接参照の結果は次のとおりです。
-
完全なデモ
-
方法 1:
1. ディレクトリを作成します:
mkdir config_test
2. ディレクトリに入り、構成スクリプトとシェル スクリプトを作成します:cd config_test/ mkdir config touch update_config.sh
スクリプトの作成: vim update_config.sh の
内容は次のとおりです。for i in config/*.py;do echo $i|grep -v '__init__'|sed 's#config/\(.*\).py#from .\1 import *#g'; done > config/__init__.py
3. config ディレクトリを作成し、次のように入力します。
vim b.py
A = 1
vim c.py
CC = 1
vim d.py
DD = 2
vim init .py、何も書き込まれず、現状は次のとおりです。
4. config_test ディレクトリに戻り、実行します。
sh update_config.sh ;cat config/__init__.py
結果が表示されます。
5. 引用
このようにして、ディレクトリファイルの内容を参照することができますが、この方法では、新しいファイルを追加する限り、スクリプトを再度実行する必要があります。
したがって、新しいファイルを追加し、このディレクトリの内容を自動的にスキャンする、より便利な方法が必要です。
- 方法 2:
ディレクトリ構造は以前と同じで、何も変更せず、__init__.py の内容を変更し、シェル スクリプト update_config.sh に
init.pyを必要としません。 内容は次のとおりです。
# __init__.py for config
def main():
import importlib
import os
cwd = os.path.dirname(os.path.abspath(__file__))
files = os.listdir(cwd)
for i in files:
if not i.startswith('_') and i.endswith('.py'):
m = '.' + i[:-3]
# get a handle on the module
mdl = importlib.import_module(m, __package__)
# is there an __all__? if so respect it
if "__all__" in mdl.__dict__:
names = mdl.__dict__["__all__"]
else:
# otherwise we import all names that don't begin with _
names = [x for x in mdl.__dict__ if not x.startswith("_")]
# now drag them in
globals().update({k: getattr(mdl, k) for k in names})
globals().pop(i[:-3])
main()
globals().pop('main')
このコードは、新しく追加したディレクトリにあるファイルの内容を自動的に読み込むことができます 追加後、直接引用することができます 結果例: 結果が
再現されます~~~