2016-11-29 108 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