先说一下搜索路径
导入一个 *.py 模块时,解释器先在当前目录中搜索名为 *.py 的文件。如果没有找到的话,接着会到 sys.path 变量中给出的目录列表中查找。 sys.path 变量的初始值来自如下:
- 输入脚本的目录(当前目录)。
- 环境变量 [PYTHONPATH] 表示的目录列表中搜索
(这和 shell 变量 PATH 具有一样的语法,即一系列目录名的列表)。 - Python 默认安装路径中搜索。
模块(module)是什么
-
模块是包括 Python 定义和声明的文件。文件名就是模块名加上 .py 后缀。如以下文件命名为fibo.py
# Fibonacci numbers module def fib(n): # write Fibonacci series up to n a, b = 0, 1 while b < n: print(b, end=' ') a, b = b, a+b print() def fib2(n): # return Fibonacci series up to n result = [] a, b = 0, 1 while b < n: result.append(b) a, b = b, a+b return result
-
怎么引用模块
在 python 解释器中:>>> import fibbo
这样做不会直接把 fibo 中的函数导入当前的语义表;它只是引入了模块名 fibo。你可以通过模块名按如下方式访问这个函数:
>>> fibo.fib(1000) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 >>> fibo.fib2(100) [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] >>> fibo.__name__ 'fibo'
导入模块内部的函数/变量等,可以以如下方式导入
>>> from fibo import fib >>> fib(1000)
模块可以导入其他的模块。一个(好的)习惯是将所有的 import 语句放在模块的开始(或者是脚本),这并非强制。
包(package)是什么
-
一个包就是放在一个文件夹里的模块集合。包的名字就是文件夹的名字。我们需要做的是告诉python这个文件夹是一个包,并且把一个名为_init_.py的文件(通常是空的)放在这个文件夹里。
一个包的例子sound/ Top-level package __init__.py Initialize the sound package formats/ Subpackage for file format conversions __init__.py wavread.py wavwrite.py aiffread.py aiffwrite.py auread.py auwrite.py ... effects/ Subpackage for sound effects __init__.py echo.py surround.py reverse.py ... filters/ Subpackage for filters __init__.py equalizer.py vocoder.py karaoke.py ...
-
怎么引用包
用户可以每次只导入包里的特定模块,例如:import sound.effects.echo
这样就导入了 sound.effects.echo 子模块。它必需通过完整的名称来引用:
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)导入包时有一个可以选择的方式:
from sound.effects import echo
这样就加载了 echo 子模块,并且使得它在没有包前缀的情况下也可以使用,所以它可以如下方式调用:
echo.echofilter(input, output, delay=0.7, atten=4)
还有另一种变体用于直接导入函数或变量:
from sound.effects.echo import echofilter
这样就又一次加载了 echo 子模块,但这样就可以直接调用它的 echofilter() 函数:
echofilter(input, output, delay=0.7, atten=4)
-
以 import * 的方式导入包
如果包中的 _init_.py 代码定义了一个名为 _all_ 的列表,就会按照列表中给出的模块名进行导入。 反之则不会导入子包/模块(需要手动导入) -
包内部是怎么互相引用的
绝对地址 相对地址
参考:https://docs.pythontab.com/python/python3.4/modules.html#id10
网友评论