Python的from和import⽤法
import使⼀个变量名引⽤整个模块对象,因此必须通过模块名称来得到该模块的属性,⽐如我们导⼊⼀个数学计算的模块 math:
import math
print math.pi #导出圆周率的值
>>>3.14159265359
我们导⼊math模块,在中我们会知道,这样做会得到名math的对象,这个模块对象包含了pi这样的常量,以及⼀些其它的⽅法。我们如果直接访问 pi,不加math这个前缀会发⽣什么情况呢?
print pi
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
print pi
NameError: name 'pi' is not defined
程序抛出了⼀个名为“NameError”的错误。这个时候我们可以⽤from这个⽅法来实现可以直接⽤pi这个⽅法。from会把变量名复制到另⼀个作⽤域,所以它就可以直接在脚本中使⽤复制后的变量名,⽽不⽤通过模块,例如:
from math import pi
print pi
>>>3.141592653589793
这样我们就可以直接输出 pi的值了,⽽不会报错,不需要加那个模块名加句号。有的朋友可能感觉还是⽐较⿇烦,有会有更快速、更省事的Python模块导⼊⽅法呢?还真有。
from math import *
pi
cos(pi)
>>>3.141592653589793
>>> -1.0
这样就不需要⼀个⼀样导⼊模块内部的⽅法了,⼀次性的将所有⽅法导⼊,好处是代码看起来⾮常简洁,但是如果同时导⼊多个模块,要考虑模块⽅法名冲突等这些问题,⾄于怎么样使⽤,要看你的使⽤ 。
from语句有破坏命名空间的潜质。如果使⽤from导⼊变量,变量碰巧和作⽤域中现有变量重名,变量就会被悄悄的覆盖掉。
使⽤import语句时就不存在这种问题,因为必须通过模块名才能获取其内容。不过,使⽤from时,只要你了解并预料到可能发⽣这种事,在实际情况下这就不是⼀个⼤问题了,尤其是当你明确列出导⼊变量名时(例如,from module import x, y, z)。
另⼀⽅⾯,from module import *形式的确可能破坏命名空间,让变量名难以理解,尤其是在导⼊⼀个以上的⽂件时。
  ⽐较务实的建议是:简单的模块⼀般倾向于使⽤import,⽽不是from。多数的from语句是⽤于明确列举想要的变量,⽽且限制在每个⽂件中只⽤⼀次from *形式。这样⼀来,任何⽆定义的变量名都可以认
为是存在于from *所引⽤的模块内。当你必须使⽤两个不同模块内定义的相同变量名变量时,才真的必须使⽤import,这种情况下不能使⽤from。
⼆、Python中的模块和包
每个.py⽂件都是可以认为是⼀个Python模块,.py⽂件中可以包含类、⽅法、变量和常量(Python还没有严格意义上的常量,只是约定⼤写的变量作为常量),⽂件内也可以直接写所有的逻辑语句并在加载时从上之下直接执⾏,这与其他解释型语⾔是类似的。例如我们选择在⽂件夹ModuleAndPackage中创建⼀个⽂本⽂件person.py⽂件即创建了⼀个简单的Python模块,
Python需要去某些固定的路径下去查Python模块,上⾯我们设置在ModuleAndPackage中查。但是这些路径下也是有⽬录层次的,Python是如何查⼦⽬录中的模块呢?特别是引⽤第三⽅包时,我们也需要知道⼀定的层次关系。实际上,Python通过⽬录和⽂件构建包结构,并且包是层层嵌套的,这样就构成了包内的访问路径。例如我们在ModuleAndPackage⽂件夹下,创建⼀个⽂件夹animal,⾥⾯创建⼀个⽂本⽂件pet.py。
那么如何引⽤pet.py这个模块呢?按照Python的约定,需要在animal⽂件夹中创建名为__init__.py的空⽂本⽂件,以标识animal⽂件夹是⼀个包。倘若animal⽂件夹内还有⽂件夹作为包,也必须包含__init__.py⽂件。这样就层层标识了访问的路径。
简答来说,只要Python模块在其执⾏环境配置的搜索路径中,并且其所在位置是包结构的⼀部分,那么我们就可以引⽤该模块。
在导⼊⽂件的时候,Python只搜索当前脚本所在的⽬录,加载(entry-point)⼊⼝脚本运⾏⽬录和sys.path中包含的路径例如包的安装地址。所以如果要在当前脚本引⽤其他⽂件,除了将⽂件放在和脚本同⼀⽬录下,还有以下⼏种⽅法。
1. 将⽂件所在位置添加到sys.path中
通过sys模块的append⽅法在Python环境中增加搜索路径。
import sys
sys.path.insert(0, '/path/to/application/app/folder')
sys.path.append('/path/to/application/app/folder')#2个都⾏
import file
./ 。    ../ ⽗级⽬录。    / 根⽬录。
2. 在⽂件⽬录下新建__init__.py⽂件然后调⽤⽂件
from application.app.folder.file import func_name
__init__.py⽂件的作⽤
该⽂件的主要作⽤使初始化Python包。如果⽬录下⾯包含了该⽂件,Python解释器就会将该⽬录当做⼀个包,下⼀步就可以使⽤import语句在别的.py脚本中引⽤该⽬录下的⽂件。⼀个标准Python模块的结构如下所⽰:
package/
__init__.py
file.py
file2.py
subpackage/
__init__.py
submodule1.py
submodule2.py
__init__⽂件可以为空但可以⽤来建⽴对包的需求。⼀般来说会在该⽂件中写那些类,函数等需要被导⼊到包⽔平,从⽽可以被⽅便的引⽤。__init__⽂件提前准备包内需要被引⽤的各个模块中的变量,类似于向外部引⽤者暴露包内接⼝。
1、如果file.py⽂件中有⼀个File类,在__init__.py⽂件中啥都没写时引⽤File类需要这样操作:
from package.file import File
python怎么读取py文件2、如果在__init__.py⽂件中将file导⼊包,那就在包⽔平可以直接引⽤File类:
# in your __init__.py
from file import File
# in your script
from package import File
此外,还需要注意的⼀点是:如果解释器在__init__.py⽂件中观察到了__all__变量,那么在运⾏from package import *时就只会引⼊__all__变量中列出的那些模块。例如:如果想在上述结构的只引⼊submodule1模块,那么可以在subpackage/__init__.py⽂件中定
义__all__ = ['submodule1'],当引⽤subpackage时from subpackage import *就只引⼊了submodule1模块。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。