2013-02-07 24 views
0

我的問題是很容易,但我找不到一個好的答案,因爲搜索引擎模糊術語「模塊」。 我想要做什麼大致是這樣的:導入模塊元素在另一個沒有限定名

模塊:a.py

x = 2 

模塊:b.py

import a 

現在,我希望能從b訪問x而不使用合格的名稱(即,沒有鍵入a.x,僅需要x)。在我的情況,我不能使用:

from a import x 

,因爲我不知道哪些元素a將包含的內容。我不能使用

from a import * 

既不。有沒有簡單的方法來合併或加入模塊(我的意思是對象模塊)?

+0

您不需要太多,是嗎? –

+0

爲什麼你不能使用'from import *'? – ATOzTOA

回答

1

這是不是一個好主意,但是你可以使用:

globals().update(vars(a)) 

a模塊中定義的所有名稱添加到您當地的命名空間。這與from a import *幾乎相同。要模擬from a import *準確,不使用from a import *本身,你不得不使用:

globals().update(p for p in vars(a).items() if p[0] in getattr(a, '__all__', dir(a))) 

你通常只將使用x = a.xfrom a import x

如果您使用的是zipimport,則無需執行任何操作。只需將存檔路徑添加到您的文件夾中即可:sys.path

import sys 
sys.path.insert(0, '/path/to/archive.zip') 
from test import x 
+0

事實上,我不想從** a **導入所有名稱,只是其中的一些(取決於它們的類型)。我會嘗試你的解決方案,但我認爲有一個更安全的替代方案來更新全局變量() – ibi0tux

+0

@ ibi0tux:爲什麼使用'x = a.x'並不是很清楚爲什麼你不能這樣做。動態添加名稱到你的名字空間需要操作'globals()'或者使用'exec',並且當'globals()'完成時我不能推薦後者。 –

+0

其實這個模塊是用zipimport導入的,我有類似的東西: 'a = zipimport。 zipimporter(「archive.zip」)' 'mod_a = a。 load_module(「test」)#考慮到archive.zip包含模塊測試' 'print mod_a。值#考慮價值是在模塊測試中定義的 有什麼辦法直接在全球進行導入? – ibi0tux

相關問題