2017-12-13 3 views
0

にディレクトリからすべてのモジュールは、私が取引所からのすべてのモジュールが、私はそれらを反復してインスタンス化することができるようにフォルダ動的負荷を希望exchange.pyインポート配列

exchange.py 
exchanges/ 
    kraken.py 
    gemini.py 
    bitfinex.py 

今私のディレクトリ構造を見よプログラム内でクラスを作成します。擬似コード:

exchanges = load_modules('exchanges') 
for module in exchanges: 
    config = module.CONFIG # a global 
    for class in module: 
     loaded_classes.append(module.class) # add each class in each module to a list 

目標は、すべての貢献者は、exchange.pyから継承するクラスを作成して自動的に、その構成をロードしますexchangesフォルダやアプリにそれを置くことを可能にすることです。

私はthis answerを見ましたが、これはosモジュールを使ってディレクトリ内のすべてのファイルを読み込みますが、これは私にとっては不合理なことです。

答えて

0

あなたはあなたがのために機能__import__またはモジュールimportlibを使用することができ、このよう

from exchanges import * 
+0

2つの質問が残っています:1 /私は '__init __。py'の追加が非難されたと思っていました.2 /どうすればそのフォルダのモジュールの名前、サブクラス、グローバルに動的にアクセスできますか? – bluppfisk

+0

回答1. '__init __。py'は価値が下落していないと思います。 2.あなたは 'importlib'を使って自分の仕事であるとは思わなかったあなたの仕事 –

0

を使用して、すべてのモジュールをインポートすることができますそうすることによって、Pythonのパッケージとして

import sys 
sys.path(path_to_modules_directory) 

それを作る__init__.pyexchangesにフォルダを追加します。仕事で 最初にpythonファイルのディレクトリをスキャンする必要があります。輸入後は__import__またはimportlibとなります。より良いimportlib

import os 
import sys 

def import_libs(path): 
    sys.path.append(path) 
    return [__import__(os.path.join(path, module)) for module in filter(lambda x: x and x[-3:] == ".py", os.listdir("./modules/calculate/calculate"))] 

print(import_libs('exchanges')) 

を使用する。また、私は一つの質問がありますか?なぜあなたはこれをする必要がありますか? 工場のデザインパターンを見ればより良いと思います。

+0

を使うことができますが、あなたは工場のデザインパターンを調べるべきでしょう。それほどまだありません。目標は交換ファイルフォルダに.pyファイルをドロップすることで誰もがプラグインを作成できるようにすることです – bluppfisk

+0

例コンテナの「レジストリ」クラス クラスレジストリ(タイプ): def registry_class(cls): container = cls.container コンテナでない場合: リターン container.classes [cls.kind] =のCLS デフ__new __(メタ、名前、塩基、DCT): CLS =スーパー(レジストリ、メタ).__新しい__(メタ、名前、塩基、 dct) cls.registry_class() return cls –

+0

また、モジュールimportlibの__import__または関数は、オブジェクトのようなオブジェクトを返します。オブジェクトにはモジュールまたはクラスリストのコンテンツのグローバルとローカルがあります。 –

関連する問題