2016-07-11 8 views
2

A solutionは、Python 2のために利用可能であるが、それは、ファイルベースのインポートに適していますimportlibに置き換えられているPythonの3Python 3のモジュールを文字列からインポートするには?この問題の

impで廃止されimpモジュールを使用しています。具体的には、importlib.import_moduleにはファイル名が必要です。文字列やファイルハンドラではありません。

私は、ファイルへのURLの内容をダンプし、それを

def initlog(): 
    modulename = '_mylogging' 
    try: 
     import _mylogging 
    except ImportError: 
     r = requests.get('http://(...)/mylogging.py') 
     with open(modulename+'.py', "w") as f: 
      f.write(r.text) 
    finally: 
     import _mylogging 

    return _mylogging.MYLogging().getlogger() 

をインポートすることで、回避策を作ったが、私は中間ファイルを避けるためにしたいと思います。

セキュリティ、ネットワークパフォーマンス、およびアベイラビリティの問題を別に置くと、は文字列をimportlibに送りますか?(または私はio.StringIOを使用することになり、その場合には、ファイルハンドラから)

答えて

2

あなたはthe replacement for imp.new_moduleを使用して、3.xへexactly the same answerを適応させることができます。

from types import ModuleType 

foo = ModuleType('foo') 

the replacement for the exec statement

foo_code = """ 
class Foo: 
    pass 
""" 

exec(foo_code, globals(), foo.__dict__) 

後すべてが期待通りに機能します:

>>> dir(foo) 
['Foo', '__doc__', '__loader__', '__name__', '__package__', '__spec__'] 
>>> foo.Foo() 
<__main__.Foo object at 0x110546ba8> 
関連する問題