Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何导入工作。为什么导入的模块不继承其他导入的模块_Python_Module_Import - Fatal编程技术网

Python 如何导入工作。为什么导入的模块不继承其他导入的模块

Python 如何导入工作。为什么导入的模块不继承其他导入的模块,python,module,import,Python,Module,Import,我只是“想”我了解导入和模块是如何工作的,但显然我需要更多的教育 下面是一个示例程序(只是我正在做的某个范围和规模更大的事情的一个测试用例)和一个模块: 快 import gtk from quick_window import * w.show_all() gtk.main() 快速窗口.py w = gtk.Window() w.connect('destroy', lambda w: gtk.main_quit()) l=gtk.Label('Hello') w.add(l) 跑步是

我只是“想”我了解导入和模块是如何工作的,但显然我需要更多的教育

下面是一个示例程序(只是我正在做的某个范围和规模更大的事情的一个测试用例)和一个模块:

import gtk
from quick_window import *

w.show_all()
gtk.main()
快速窗口.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?这是否意味着我的内存中有2个“gtk”

我是否必须导入每个模块中需要的所有内容

我知道每个模块都有自己的名称空间,但我认为它也继承了“globals”,包括从调用程序导入的模块

我的印象是,模块导入*就像将代码剪切粘贴到那个位置。还有别的办法吗

非常感谢您的帮助


Narnie

导入是将py文件的内容引入该模块的命名空间所必需的-如果不导入,则无法引用其中的名称

更多信息:

当Python导入模块时,它首先 检查模块注册表 (系统模块)以查看模块是否正确 已经进口了。如果是这样的话, Python使用现有的模块对象 原来如此


导入的细节变得非常复杂,但概念上非常简单

当你写作时:

import some_module
这相当于:

some_module = import_module("some_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
这里需要注意两件事:某些_模块的赋值是特定的:import语句在当前模块中实际上什么都不做,只是将模块对象赋值给指定的名称。这就是为什么不能自动从导入的模块中获取名称,以及为什么它不像将导入的代码复制到当前模块中


另外,在import_module伪函数中,如果名称已经导入到某个地方,那么它将位于所有模块(sys.modules)的全局列表中,因此将被重用。该文件不会再次打开,不会再次执行,该模块中的全局变量不会再次获得新值,等等。将同一个模块导入到多个位置不会造成浪费或额外工作,速度非常快。

请特别注意,无论您导入模块多少次,导入模块中的外部作用域代码只运行一次(当然,卸载和重新加载除外)。OP在内存中不会有2'gtk。后续导入的效果只是将内容引入本地名称空间。感谢您的澄清。这样做似乎有很多“额外”的工作和一点浪费,但如果是这样的话,就是这样。谢谢你的链接。我刚开始阅读它,我认为这正是我需要在python中更好地思考的地方。这个“引擎盖下”的峰值帮助我更好地理解正在发生的事情。谢谢。至少因为您不应该在导入模块也导入了特定模块的假设下编写模块。
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