2017-12-21 10 views
1

Pythonは私の言いたいことをしています。いくつかのモジュールを読み込んでクラスを動的にインスタンス化するのはとても難しいとは思いません。私はここでいくつかの他の質問を読んだが、提供された解決策のどれも私のために働くようではない。クラスを動的にロードして参照を取得します

マイフォルダ構造

./coin.py 
./exchanges/ 
    /bittrex.py (contains Bittrex class) 
    /kraken.py (contains Kraken class) 
    ... 

私の目標

、任意のハックの手段として少しのコードでとせずに、動的にこれらの各モジュールをインポートし、クラスへの参照内を取得するには私はそれらをインスタンス化してその属性を得ることができます。

私の現在のコード

import glob, exchanges, dirfiles, isfile, inspect 

dirfiles = glob.glob(dirname(__file__) + "/exchanges/*.py") 
__all__ = [ basename(f)[:-3] for f in dirfiles if isfile(f) and not f.endswith('__init__.py')] 

class Indicator(object): 
    def __init__(self): 
     for exchange in __all__: 
      class_name = exchange.capitalize() 
      class_ = getattr(exchange, class_name) 

      self.EXCHANGES.append({ 
       'code': exchange, 
       'name': class_name, 
       'instance': class_(self) 
      }) 

しかし上記のコードと、私はいつもそれを文字列として私の意図したクラス参照の解釈で終わる試した多くの異なる順列。

+0

動的に、クラス名はa = 'Bittrex'のように変数に格納されます。ありがとう。 –

答えて

1

のimportlibは動的モジュールやパッケージの読み込みができ、そしてos.listdirは、ファイルを見つける簡素化:

import os 
import importlib 

for p in os.listdir('exchanges'): 
    if p[-3:] == '.py' and p != '__init__.py': 
     module_ = importlib.import_module("exchanges.%s" % p[:-3]) 
     class_ = getattr(module_, class_name) 

     self.EXCHANGES.append({ 
      'code': exchange, 
      'name': class_name, 
      'instance': class_(self) 
     }) 

私はあなたのコード内capitalzeについて不明な点です。それが各ファイルの関数であれば、次のように実行できます:

capitalize = getattr(module_, 'capitalize') 
class_name = capitalize() 
+0

ありがとうございます。私はこれを試みましたが、import_module()関数は 'exchange'という名前空間オブジェクトを返しますが、モジュールの中ではそれを返しません。今のところ働いているようです(あなたが以前に何日もなかったとしても、あなたはいつもSOの投稿後に解決策を見つけます)。 'capitalize()'は大文字で書かれたクラスをロードすることです。 – bluppfisk

+0

は、私が '__import __()'ステートメントで 'fromlist = [exchange]'が必要であることが判明しました。これはimportlibでは不要なことです。ありがとうございました! – bluppfisk

+0

除外するファイルがさらにある場合は、条件を拡張する必要があると思います。残念ながら、私は詳細を持っていないので、私はそれをより良く判断できません。 – clemens

0

importlibモジュールを使用できます。

ディレクトリ構造:dsp.pyの

Current_Dir 
    | 
    |---qwerty.py 
    | 
    |---dinesh 
      | 
      |--dsp.py -->> This file has class 'call_me' 

コード:qwerty.pyの

class call_me(object): 

    def __init__(self): 
     pass 

    def run(self): 
     print("Dinesh") 

コード:

例の下

ご確認ください0

import sys 
import os 
import importlib 

lib_path = os.getcwd() + os.sep + 'dinesh' 
sys.path.insert(0,lib_path) 

mod = importlib.import_module('dsp') 
a = getattr(mod,'call_me') 
s = a() 
s.run() 

出力

C:\Users\punddin\PycharmProjects\demo>python qwerty.py 
Dinesh 
関連する問題