导入模块
导入模块非常简单,使用Python关键字来导入Python即可,没啥太多好解释的
import os # 全部导入
from os import getcwd # 部分导入
import os as os_l # 创建导入别名
from os import getcwd as pwd
自定义模块
在Python中,Python文件即模块,模块名为文件名
因为文件名是模块名,因此要求文件名必须符合Python标识符的规范,否则无法导入
另外需要注意的是,如果你导入的是Python的标准库,那么你就不要在当前文件的目录下创建和标准库相同的名字,否则会出现导入错误模块的情况,每次导入模块Python都是去sys.path中去找模块文件的
In [2]: sys.path
Out[2]:
['',
'/root/.pyenv/versions/3.6.1/envs/lanyulei/bin',
'/root/.pyenv/versions/3.6.1/lib/python36.zip',
'/root/.pyenv/versions/3.6.1/lib/python3.6',
'/root/.pyenv/versions/3.6.1/lib/python3.6/lib-dynload',
'/root/.pyenv/versions/3.6.1/envs/lanyulei/lib/python3.6/site-packages',
'/root/.pyenv/versions/3.6.1/envs/lanyulei/lib/python3.6/site-packages/IPython/extensions',
'/root/.ipython']
当导入的文件不存在的时候就会抛出模块不存在的错误
In [3]: import sdf
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
<ipython-input-3-0c4351672b24> in <module>()
----> 1 import sdf
ModuleNotFoundError: No module named 'sdf'
Python标识符的规范,字母,数字,下划线组成,不能以数字开头,通常模块名都是定义为小写,如果有多个单词的话,下划线为分割符
Python中导入的本质就是执行,导入模块的时候,就相当于执行模块了
因为Python导入的缓存机制,所以不论导入几次,仅执行一次
既然导入即执行,那么我们就慎重的导入模块,不要导入不受信任的模块,避免造成不必要的损失
__name__属性,当模块被import的时候__name__是模块名称,当执行执行Python文件的时候__name__是 __main__,当我们需要执行测试代码的时候,可以放到这里
目录作为模块
在Python种目录同样也是可以作为一个模块的
如果目录作为一个模块的话,就需要有一个__init__.py的文件,也可以叫做入口文件,因为如果没有这个文件的话,目录将无法称之为一个完整的模块,在旧版本的Python中,没有中文件是无法导入子模块的,但是在新版的Python中已经去掉了这个限制
当一个模块的规模较大的时候,用目录的形式,可以更好的组织代码
目录作为目录的特点
- 单独导入目录模块的话,不会自动导入子模块
- 部分导入子模块的话,会自动导入父模块,即目录模块
目录的可见性
在Python的模块引用是,模块的成员是不存在私有这一说法的,但是按照惯例,模块以下划线开始,但是非双下划线开始的,双下划线结尾的成员,认为是私有的
模块变量可以被修改,并且在修改之后,引入此模块,变量是修改后的,修改后的变量会影响到所有引入此模块的模块,所以修改是一件非常危险的事情
通常情况下,要绝对禁止修改模块变量
setup.py
当我们需要将我们的模块或者程序打包的时候,只需创建一个setup.py的文件即可
下面的几行代码仅为测试,具体的根据实际情况去修改,认真学习setup方法即可
参考文档:https://docs.python.org/3.5/distutils/setupscript.html
from distutils.core import setup
setup(name='test', version='0.0.1', packages=['m', 'm.foo'])