文件可以通过导入一个模块读取这个模块的内容。导入从本质上来讲,就是载入另一个文件,并能够读取那个文件的内容;

于模块的方式使模块变成为Python 程序架构的一核心慨念。更大的程序往往以多个模块文件的形式出现,并且导人了其他模块文件的工具。其中的一个模块文件设计成主文件,或叫做顶层文件(就是那个启动后能够运行整个程序的文件);

       

导入文件是另 种运行文件的方发;但是在默认情况下,只是在每次会话的第一次运行(真的,不信你可以试一
下)。在第一次导入之后,其他的导入都不会再工作,甚至在另一个窗口中改变并保存了模块的源代码文也不行。

是如果真的想要 python在同一次会目中再次运行文件(不停止和重新启动会话),需要调用imp 标准库模块中可用的reload函数(这个函数也是一个Python 2.6 内置函数,但是在python3.0 中不是内置的)。
>>> fromimp import reload
>>>reload(scriptl)

得的参数是一个已经加载了的模块对象的名称,所以如果在重载之前请确保已经成功地导入了这个模块。值得注意的是,reload 函数在模块对象的名称前还需要括号,import 则不需要reload是一个被调用的函数,而import是一个语句。

模块的显要特性:属性

一般意义上来说,模块往往就是变量名的封装,被认作是命名空间。在一个包中的变量名就是所谓的属性:也就是说,属性就是绑定在特定的对象上的变量名(就像一个模块)。

在典型的应用中,导入者得到了模块文件中在顶层所定义的所有变量名。这些变量名通常被赋值给通过模块函数、类、变量以及其他被导出的工具。这些往往都会在其他文件或程序中使用。 表面上来看,一个模块文件的变量名可以通过两个Python 语句读取一import from ,以及reload 调用。
          内置函数dir() 可以获取模块可用变量名列表;

模块和命名空间

来说, Python 程序往往由多个模块文件构成,通过import 块文件是一个独立完备的变量包,即一个命名空间。一个模块文件不能看到其他文件定义的变量名,除非它显式地导入了那个文件,所以模块文件在代码文件中起到了最小化命名冲突的作用。因为每个文件都是一个独立完备的命名空间,即使在它们拼写相同的情况下,一个文件中的变量名是不会与另一个文件中的变量冲突的。

使用exec运行模块文件
例如,exec(open('module.py' ).read()) 内置函数调用,是从交互提示模式启动文件而不必导入以及随后的重载的一种方法。每次exec都运行文件的最新版本,而不需要随后的重载.
默认情况下,每次以这种方式调用exec的时候,它都重新运行文件,就好像我们把文件粘贴到了调用exec的地方. 因此, exec不需要在文件修改后进行棋块重载,它忽略了常规的模块导入逻辑。

缺点是,由于exec的工作机制就好像在调用它的地方粘贴了代码一样,和前面提到的from一样,对于当前正在使用的变量有潜在的默认覆盖的可能。

相反,基本的import语句每个进程只运行文件一次,并且它会把文件生成到一个单独的模块名称空间中, 以便它的赋值不会改变你的作用域中的变量。为模块名称空间分隔所付出的代价是, 在修改之后需要重载。

命名空间就是变量(也就是变量名)的封装。它在Python中以一个带有属性的对象的形式出现。每个模块文件自动成为一个命名空间:也就是说,一个对变量的封装,这些变量对应了顶层文件的赋值。命名空间可以避免在Python程序中的命名冲突一一因为每个模块文件都是独立完备的命名空间,文件必须明确地导入其他的文件,才能使用这些文件的变量名。