2016-11-29 66 views
0

我有以下设置。我试图在a.py中动态加载一个模块(在这种情况下,从c.py中调用它并将其调用为BeLoaded)。然后我想导入另一个模块fileB,它有一个类将继承该类toBeLoaded.anotherClass。我知道如果我在b.py中导入c.py,它会解决问题,但由于我动态加载c.py,所以我不知道如何实现。它会工作,如果我可以以某种方式传递一个变量b.py之前,它被导入,但我不知道如何做到这一点。在导入之前将变量传递给模块

这是我目前的设置。

a.py

import imp 
from optparse import OptionParser 

parser = OptionParser() 
parser.add_option("-c","--configFile",dest="configFile", default="c.py",help="") 
(options, args) = parser.parse_args() 

modulePath=options.configFile 
toBeLoaded = imp.load_source('toBeLoaded',modulePath) 

import b 

b.py

class TestClass(toBeLoaded.anotherClass): 
    def __init__(self): 
    print self.x 
    #do stuff here 

c.py

class anotherClass(): 
    def __init__(self): 
    self.x=5 

我得到以下错误:

Traceback (most recent call last): 
    File "a.py", line 6, in <module> 
    import b 
    File "/test/b.py", line 1, in <module> 
    class TestClass(toBeLoaded.anotherClass): 
NameError: name 'toBeLoaded' is not defined 
+0

在解决问题我不明白为什么你不只是导入anotherClass在b.py和IM敢肯定你不能传递任何东西一个模块,你也不应该尝试。 –

+0

我可能已经过于简化了。但是,a.py的工作方式是使用sys.argv动态加载模块。我将编辑上面的代码。 – user1763510

+0

其实我是从optparse import OptionParser使用 – user1763510

回答

0

正如我所说,我很确定你不能这样做,即使你找到了一种方式,你不应该这样做。

您应该考虑以另一种方式组织代码,而不是通过导入内部进行爬取。 :)

编辑:你的目标似乎加载配置文件,我建议要么:

  1. 使用基本数据类型,而不是外部类的引用
  2. 采取configparser
  3. 使用json看看
+0

我可以简单地将TestClass移动到a.py来解决问题。但我试图保持文件相对简单。你有任何其他建议如何解决这个问题? – user1763510

+0

在我看来,应该尽可能简单的唯一文件是configfiles(我提到了上面的3个选项),并且如果绕过正常程序员期望的正常导入机制,则通常程序不会更简单。 –

0

不知道它是否是最干净的方法。但是,如果c.py改为

c.py

from __main__ import modulePath 
import imp 
toBeLoaded = imp.load_source('toBeLoaded',modulePath) 

class TestClass(toBeLoaded.anotherClass): 
    def __init__(self): 
    print self.x 
    #do stuff here