2
import v_framework as framework
framework.loadModules(["Maintenance"])
framework.Maintenance.showPage()

frameworkが持っている:

def loadModules(aModules):
    d_utility = {"Maintenance":"COOl_M_PAGE"}
    for module in a_aModules:
        exec("import " + d_utility[module] + " as " + module)

が実行されると、名前空間loadModulesにモジュールがインポートされます。としてv_frameworkインポートしているので、インポートしたモジュールはを使用して使用できるはずです。しかし、それはそのようには機能しません。私がやろうとしていることをする方法はありますか?または、実行される名前空間以外の名前空間にモジュールをインポートする方法はありますか?v_frameworkframeworkframework.Maintenanceexec

4

2 に答える 2

1

モジュールを動的にインポートするためのライブラリがあります。importlibを使用できます(そして、役に立つかもしれないもう1つはpkgutilです)。さて、あなたの場合、私はこれが仕事をするだろうと思います:

import importlib
mods = {}
def loadModules(aModule):
    global mods
    mods[module] = importlib.import_module(d_utility[module])
    # or maybe globals()[module] = ... would work also (exactly as you expect it to

更新:execは、グローバルな名前空間ではなく、関数のローカルな名前空間を変更します(私は思います)。

それが役に立てば幸い。:)

于 2012-04-13T20:18:51.220 に答える
1

関数内にいる場合import、モジュールは通常どおりインポート/実行されますが、インポートする名前は、関数内に割り当てられている他の変数と同様に、関数に対してローカルです。

>>> def test_import():
...    import os
...    print os
...
>>> test_import()
<module 'os' from '/usr/lib/python2.7/os.pyc'>
>>> os
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'os' is not defined

osただし、インポートされており、次の方法でアクセスできますsys.modules

>>> import sys
>>> sys.modules['os']
<module 'os' from '/usr/lib/python2.7/os.pyc'>
>>> os = sys.modules['os']
>>> os
<module 'os' from '/usr/lib/python2.7/os.pyc'>

あなたがやりたいことをするための速くて汚い方法はこのようなものでしょう。execローカル変数およびグローバル変数として使用されるオプションのマッピングを取ります。だからあなたはすることができます

def loadModules(aModules):
    d_utility = {"Maintenance":"COOl_M_PAGE"}
    for module in aModules:
        exec ('import %s as %s' % (d_utility[module], module)) in globals()

これは醜く、おそらくセキュリティに影響を与えるか何かがありますが。jadkik94が言及しているように、これに対処するためのよりクリーンな方法を提供するライブラリがあります。

于 2012-04-13T20:22:27.630 に答える