我只是“想”我理解导入和模块是如何工作的,但显然我需要更多的学校教育。
这是一个示例程序(只是一个测试案例,我正在做的事情,范围和规模要大得多)和一个模块:
quick.py
import gtk
from quick_window import *
w.show_all()
gtk.main()
quick_window.py
w = gtk.Window()
w.connect('destroy', lambda w: gtk.main_quit())
l=gtk.Label('Hello')
w.add(l)
跑步我
$ python quick.py
Traceback (most recent call last):
File "quick.py", line 2, in <module>
from quick_window import *
File "/home/woodnt/Dropbox/python/weather_project/plugins/quick_window.py", line 3, in <module>
w = gtk.Window()
NameError: name 'gtk' is not defined
为了让它工作,我还必须在模块中导入(呃,重新导入)gtk,如下所示:
import gtk
w = gtk.Window()
w.connect('destroy', lambda w: gtk.main_quit())
l=gtk.Label('Hello')
w.add(l)
为什么我要多次导入gtk?这是否意味着我在内存中有2个“gtk”?
我是否必须在该模块中导入我需要的每个模块中的所有内容?
我知道每个模块都有自己的命名空间,但我认为它还继承了“globals”,包括来自调用程序的导入模块。
我的印象是,from module import *就像将代码剪切并粘贴到该位置一样。还有另一种方法吗?
非常感谢帮助。
Narnie
答案 0 :(得分:13)
导入的细节变得非常复杂,但从概念上讲它非常简单。
当你写:
import some_module
相当于:
some_module = import_module("some_module")
其中import_module有点像:
def import_module(modname):
if modname in sys.modules:
module = sys.modules[modname]
else:
filename = find_file_for_module(modname)
python_code = open(filename).read()
module = create_module_from_code(python_code)
sys.modules[modname] = module
return module
这里要注意两件事:some_module的赋值是特定的:除了将模块对象分配给您指定的名称外,import语句在当前模块中什么都不做。这就是为什么你不自动从导入的模块中获取名称,以及为什么它不像将导入的代码复制到当前模块中那样。
此外,在import_module伪函数中,如果名称已经在某处导入,它将位于所有模块的全局列表中(sys.modules),因此只需重复使用。该文件不会再次打开,也不会再次执行,该模块中的全局变量不会再次获取新值,依此类推。将相同的模块导入许多地方并不浪费或额外的工作,它非常快。
答案 1 :(得分:6)
需要导入才能将py文件的内容带入该模块的命名空间 - 如果不导入,则无法引用其中的名称。
更多信息:http://effbot.org/zone/import-confusion.htm
当Python导入模块时,首先是它 检查模块注册表 (sys.modules)查看模块是否 已经进口了。如果是这样的话, Python使用现有的模块对象 原样。