如何在其他模块或文件中提供动态导入的模块?

时间:2013-01-30 00:02:32

标签: python import eval

我有3个文件a.py,b.py,c.py

我正在尝试从a.py中动态导入c.py中定义的名为“C”的类 并在b.py

中提供评估名称

python a.py目前正在捕获NameError。我试图避免这种情况并创建一个 b.py中的实例调用C.do_int(10)

a.py

import b

#older
#services = __import__('services')
#interface = eval('services.MyRestInterface')

# python2.7
import importlib
module = importlib.import_module('c')
interface = eval('module.C')

# will work
i = interface()
print i.do_int(10)

# interface isn't defined in b.py after call to eval
try:
  print b.call_eval('interface')
except NameError:
  print "b.call_eval('interface'): interface is not defined in b.py"

b.py

def call_eval(name):
  interface = eval(name)
  i = interface()
  return i.do_int(10)

c.py

class C(object):
  my_int = 32
  def do_int(self, number):
    self.my_int += number
    return self.my_int

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:0)

interface仅存在于a的命名空间中。您可以将接口的引用添加到b的命名空间中,如此

b.interface = interface
try:
  print b.call_eval('interface')
except NameError:
  print "b.call_eval('interface'): interface is not defined in b.py"

我不确定为什么你不只是将界面传递给call_eval

答案 1 :(得分:0)

我确信应该有一个更好的解决方案,完全避免这种情况。

但这可以解决问题:

a.py:

shared_variables = {}
import b

import c
shared_variables['C'] = c.C

b.do_something_with('C')

b.py:

from __main__ import shared_variables

def do_something_with(name):
    print(shared_variables[name])

答案 2 :(得分:0)

如果a.py已加载该类,我无法看到按名称传递它的原因。相反,做

# b.py
def call_eval(klass):
  j = klass()
  return i.do_int(10)

并且,在a.py中,执行

import importlib
module = importlib.import_module('c')
interface = getattr(module, 'C')
b.call_eval(interface)