标准库模块import
import sys
sys 模块,由于其是一个内置模块,因此 Python 知道应该在哪里找到它。
如果它不是一个已编译好的模块,即用 Python 编写的模块,那么 Python 解释器将从它的 sys.path 变量所提供的目录中进行搜索。如果找到了对应模块,则该模块中的语句将在开始运行,并能够为你所使用。在这里需要注意的是,初始化工作只需在我们第一次导入模块时完成。
sys.argv
变量是一系列字符串的列表(List)
如:
运行python module_using_sys.py we are arguments
'module_using_sys.py'
对应 sys.argv[0]
'we'
对应 sys.argv[1]
'are'
对应 sys.argv[2]
'arguments'
对应 sys.argv[3]
要注意到 Python 从 0 开始计数,而不是 1。
sys.path
内包含了导入模块的字典名称列表。
你能观察到 sys.path 的第一段字符串是空的——这一空字符串代表当前目录也是 sys.path 的一部分,它与 PYTHONPATH 环境变量等同。这意味着你可以直接导入位于当前目录的模块。否则,你必须将你的模块放置在 sys.path 内所列出的目录中。
另外要注意的是当前目录指的是程序启动的目录。你可以通过运行
import os;
print(os.getcwd())
来查看你的程序目前所处在的目录。
按字节码编译的 .pyc 文件
导入一个模块是一件代价高昂的事情
.pyc 为其扩展名,是将 Python 转换成中间形式的文件
这一 .pyc 文件在你下一次从其它不同的程序导入模块时非常有用——它将更加快速,因为导入模块时所需要的一部分处理工作已经完成了。同时,这些按字节码编译的文件是独立于运行平台的。
from..import 语句
如果你希望直接将 argv 变量导入你的程序(为了避免每次都要输入 sys.),那么你可以通过使用 from sys import argv
语句来实现这一点。
警告:一般来说,你应该尽量避免使用 from…import 语句,而去使用 import 语句。这是为了避免在你的程序中出现名称冲突,同时也为了使程序更加易读。
from math import sqrt
print("Square root of 16 is", sqrt(16))
模块的 name
当模块第一次被导入时,它所包含的代码将被执行。我们可以通过这一特性来使模块以不同的方式运行,这取决于它是为自己所用还是从其它从的模块中导入而来。这可以通过使用模块的 name 属性来实现。
if __name__ == '__main__':
print('This program is being run by itself')
else:
print('I am being imported from another module')
每一个 Python 模块都定义了它的 name 属性。如果它与 main 属性相同则代表这一模块是由用户独立运行的,因此我们便可以采取适当的行动。
编写你自己的模块
案例(保存为 mymodule.py):
def say_hi():
print('Hi, this is mymodule speaking.')
__version__ = '0.1'
要记住该模块应该放置于与其它我们即将导入这一模块的程序相同的目录下,或者是放置在 sys.path 所列出的其中一个目录下。
另一个模块(保存为 mymodule_demo.py):
import mymodule
mymodule.say_hi()
print('Version', mymodule.__version__)
也可以使用如下import:
from mymodule import say_hi, __version__
say_hi()
print('Version', __version__)
这种方法缺陷:如果导入到 mymodule 中的模块里已经存在了 version 这一名称,那将产生冲突
或
from mymodule import *
这种方法缺陷:这将导入诸如 say_hi 等所有公共名称,但不会导入 version 名称,因为后者以双下划线开头。
警告:要记住你应该避免使用 import 这种形式,即 from mymodule import
。
dir 函数
内置的 dir() 函数能够返回由对象所定义的名称列表。 如果这一对象是一个模块,则该列表会包括函数内所定义的函数、类与变量。
该函数接受参数。 如果参数是模块名称,函数将返回这一指定模块的名称列表。 如果没有提供参数,函数将返回当前模块的名称列表。
要注意到 dir()
函数能对任何对象工作。例如运行 dir(str) 可以访问 str(String,字符串)类的属性。
同时,还有一个 vars()
函数也可以返回给你这些值的属性,但只是可能,它并不能针对所有类都能正常工作
包
包是指一个包含模块与一个特殊的 init.py 文件的文件夹,后者向 Python 表明这一文件夹是特别的,因为其包含了 Python 模块。
变量通常位于函数内部,函数与全局变量通常位于模块内部。
建设你想创建一个名为“world”的包,其中还包含着 ”asia“、”africa“等其它子包,同时这些子包都包含了诸如”india“、”madagascar“等模块。
下面是你会构建出的文件夹的结构:
- <some folder present in the sys.path>/
- world/
- __init__.py
- asia/
- __init__.py
- india/
- __init__.py
- foo.py
- africa/
- __init__.py
- madagascar/
- __init__.py
- bar.py
包是一种能够方便地分层组织模块的方式。你将在 标准库 中看到许多有关于此的实例。
如同函数是程序中的可重用部分那般,模块是一种可重用的程序。包是用以组织模块的另一种层次结构。Python 所附带的标准库就是这样一组有关包与模块的例子。