2017-12-20 3 views
1

どうすればPythonの文字列からクラスをインポートしてインスタンス化できますか?

from envs.test_env import TestEnv 
my_instance = TestEnv() 

ファイルtest_env.pyは、フォルダENVSであり、私はこれらの2行が正常に動作することができますが、私は、文字列でそれを行うのですか欲しいです。私はいくつかの類似のチケットがありましたが、鉱山が異なるようだ

ModuleNotFoundError: No module named 'envs/test_env' 

:私が手にエラーがある

path = "envs/test_env" 
my_class_name = "TestEnv" 
mod = __import__(path) 
my_class = getattr(my_class_name,my_class_name) 
my_instance = my_class() 

:そうENVS/test_folder.py

は、私のような文字列変数を持つようにしたいです私はいくつかの異なるものを組み合わせています。私はサブディレクトリにあるファイルをインポートしたい、私は文字列でクラス名とファイル名を持っています。

+2

を使用して==================================

: __import __(名前、グローバル=なし、ローカル=なし、fromlist =()、レベル= 0) - >モジュール モジュールをインポートします。この関数はPython インタプリタで使用するためのものであり、一般的な用途ではないため、 importlib.import_module()を使用してプログラムでモジュールをインポートする方が良いでしょう。 – ShpielMeister

+0

インポートでは、スラッシュではなくドットで区切ったディレクトリ名を使用します –

+0

dotはうまくいきませんでした – jas

答えて

0

モジュールをパスに追加します。

ディレクトリ構造

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

dsp.pyのコード:

class call_me(object): 

    def __init__(self): 
     pass 

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

qwerty.pyのコード:

import sys 
import os 

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

mod = __import__('dsp') 
a = getattr(mod,'call_me') 

s = a() 
s.run() 
は、下の私の例をチェック

出力

C:\Users\punddin\PycharmProjects\demo>python qwerty.py 
Dinesh 

====================================== " "" ドキュメンテーション文字列をimportlib

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() 
+1

これはうまくいきました!上記のコメントを読んで、 "" "Docstring:__import __(name、globals = None、locals = None、fromlist =()、level = 0)モジュール。この関数はPythonインタプリタで使用するためのものであり、汎用的なものではないので、importlib.import_module()を使用してプログラムでモジュールをインポートする方が良いです。 "" import_moduleを "適切な" pythonの方法ですか? – jas

+0

@jas - importlib.import_moduleを使ってコードを追加しました –

関連する問題