Python はディレクトリ内の各ファイルの内容を参照します。

  • 要件例
    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')

このコードは、新しく追加したディレクトリにあるファイルの内容を自動的に読み込むことができます 追加後、直接引用することができます 結果例: 結果が
ここに画像の説明を挿入
再現されます~~~

おすすめ

転載: blog.csdn.net/quanqxj/article/details/86715231