2012-12-28 55 views
8

可能重複:
Dynamic module import in Python導入文件中使用的字符串作爲名稱

我希望儘早做出一套文件,在某些時候,最好的方式來組織它是有一個列表,該列表將位於文件的最頂端,之後將會有一段荒謬的代碼來處理該列表控件以及它的操作方式。我期待寫說名單隻有一次,並表示名單文件夾和文件名的格式列表:

[(folder/filename, bool, bool, int), (folder/filename, bool, bool, int)] 

正如你所看到的,folder/filename是相同的(在某種程度上)的。文件名是文件夾名稱,最後輸入.py,但是在導入XXX時,您不需要導入XXX.py,所以我沒有看到導致問題的原因。

我面對使用這種方法是進口的問題...

for (testName, auto, hardware, bit) in testList: 
    print(testName) 
    paths = "\\" + testName 
    print paths 
    addpath(paths) 
    sys.modules[testName] = testName # One of a few options I've seen suggested on the net 
    print("Path Added") 
    test = testName + ".Helloworld()" 
    eval(test) 

因此,對於每個測試我有,打印的名字,組裝其中包含路徑("\\testName")的字符串,在這個例子中,打印測試路徑,然後將路徑添加到列表(sys.path.append(path)),然後打印以確認發生,然後組裝將由測試主模塊eval執行的字符串並最終評估它。

正如您所看到的,我目前必須在頂部有一個導入列表。我不能簡單地執行導入testNametestName的內容是我希望導入的模塊的名稱),因爲它會嘗試找到名爲testName的模塊,而不是稱爲testName的內容的模塊。

我已經看到了幾個這樣做的例子,但在我的情況下找不到任何工作。如果有人可以從字面上扔出一大堆代碼,那會很棒。

我也會要求我沒有被掛起,繪製,也沒有使用eval,它被用在一個非常受控的環境中(它循環的列表在.py文件中,所以沒有「最終用戶「應該搞砸了)。

+0

注意,縮進是正確的ST,由於某種原因,我覺得這只是網站不喜歡正確地分析我的文字:( – XtrmJosh

+1

不要使用製表符,但空間縮進。 –

+2

的Python已經有辦法管理您可能想要導入的大量'.py'文件集合,這些文件可以理解文件夾和子文件夾,可以處理相對導入,正確執行命名空間等等,它被稱爲[package](http:// docs。 python.org/2/tutorial/modules.html#packages)。是否有你不想使用它的原因? – katrielalex

回答

24

不知道如果我理解正確的一切,但你可以導入動態使用__import__模塊:

mod = __import__(testName) 
mod.HelloWorld() 

編輯:我不知道,使用__import__由python文檔進行勸阻用戶代碼:__import__ documentation(由Bakuriu說明)

這也應該工作,並會被認爲是更好的風格:

mod = importlib.import_module(testName) 
mod.HelloWorld() 
+0

奇妙的是,非常感謝,花了一個多小時的時間蒐集了關於它的信息,我儘管之前設法寫出__import __(testName),但沒有意識到我必須將響應分配給模塊或我們,幸運的是,我的所有函數都將在所有文件中被命名爲Test,所以我可以從中調用mod.Test()從今起。 – XtrmJosh

+0

@XtrmJosh你見過其他答案嗎? '__import__'是一個實現細節;你應該使用'importlib'(如果你不關心Python 3.x兼容性,則使用'imp')。 – katrielalex

16
  1. 如果您不確切地知道自己在做什麼,那麼千萬不要直接與sys.modules混淆。
  2. 有很多方法可以做到你想要什麼:
    1. 集結在__import__功能
    2. 使用imp.load_module
    3. 使用importlib.import_module

我會盡量避免使用直接使用__import__,然後使用importlib.import_module(在文檔末尾也有提示)。

+1

這是用於'import moduleName'的,其中moduleName是字符串。怎麼樣'從moduleName導入*'? –

+2

@NGGVU嘗試按照上面的方式導入模塊,然後:'globals()。update(module .__ dict __)' – Bakuriu

+0

像魅力一樣工作。謝謝! –

0

將模塊所在的路徑添加到sys.path中。使用接受字符串變量作爲模塊名稱的__import__函數導入模塊。

import sys 
sys.path.insert(0, mypath) # mypath = path of module to be imported 
imported_module = __import__("string_module_name") # __import__ accepts string 
imported_module.myfunction() # All symbols in mymodule are now available normally 
相關問題