2017-08-05 31 views
0

我在使用Python中的__import_函數導入包之後調用包時遇到問題。我會注意到使用通常的import x as y工作正常,但這對我來說是一個學習練習。我正在導入,然後檢查多個軟件包的版本,並且學習一些關於Python的知識,我想通過使用字典來自動化這個。將x = _import _(「y」)與字典值一起使用時調用模塊時出錯

我的字典裏看起來是這樣的:

pack = {"numpy": ["np", "1.7.1"]} 

,然後我用這個來加載和檢查模塊:

for keys in pack.keys(): 
    pack[keys][0] = __import__(keys) 
    print("%s version:  %6.6s (need at least %s)" %(keys, pack[keys][0].__version__, pack[keys][1])) 

這工作得很好,但是當我後來試圖調用包,它不能識別它:x = np.linspace(0,10,30) 產生一個錯誤說np不被識別,但是這個工作:x = pack[keys][0].linspace(0,10,30)

因爲這只是我學習的一種方式,所以我也會對任何改變我如何解決問題的解決方案感興趣。因爲我至少聽說過它們,所以我使用了_import__函數,因爲我不得不在字典值中使用帶引號的字符或數字值。引用的字符爲import x as y技術創建了問題。

+1

您已經導入了包,但你並沒有真正在當地的命名空間分配給一個名字。 –

+0

謝謝。我認爲這就是'x'= __import __(x)'的左邊所做的。你知道我需要更改我的代碼來修復它嗎? – user71216

+0

但你沒有分配給一個變量,你分配給一個字典裏面的元素。 –

回答

0

儘管這不是一個好的做法,但您可以使用內建函數locals動態地創建變量。

所以,

for module, data in pack.items(): 
    locals()[data[0]] = __import__(module) 
    nickname = locals()[data[0]] 
    print("%s version:  %6.6s (need at least %s)" %(module, nickname.__version__, pack[module][1])) 

輸出

numpy version:  1.12.1 (need at least 1.7.1) 
+0

這很有效,謝謝。你能幫我理解它在做什麼嗎?我無法理解locals()函數。 – user71216

+0

locals()函數返回一個字典,其中本地作用域中的變量名稱爲鍵,其內容爲值。所以你可以創建一個局部變量'locals()['variable'] = 4'。如果你打印(可變)結果4 – Ricardo

相關問題