模块分为三种:
1、自定义模块
2、第三方模块
3、内置模块
不能导入一个跟内置模块同名的自定义模块。
运行一个py文件,会导入当前文件所在文件夹的路径到sys.path里。
导入模块就是到sys.path所有的路径里查找这个模块,如果有就导入成功,没有就失败。
导入目录的本质就是执行该目录下面的__init__.py文件
注意:两个程序不要互相调用模块
如果文件夹下有__init__.py文件,就称这个文件夹为包,这个时候可以直接导入这个文件夹
zhou@ubuntu:~/python/01-模块$ ll TestMsg/
total 28
drwxrwxr-x 3 zhou zhou 4096 1月 9 23:00 ./
drwxr-xr-x 3 zhou zhou 4096 1月 9 23:00 ../
-rw-rw-r-- 1 zhou zhou 72 1月 9 22:41 __init__.py
-rw-r--r-- 1 zhou zhou 30 1月 9 15:26 main.py
drwxr-xr-x 2 zhou zhou 4096 1月 9 22:41 __pycache__/
-rw-r--r-- 1 zhou zhou 42 1月 9 22:16 recvmsg.py
-rw-r--r-- 1 zhou zhou 42 1月 9 22:15 sendmsg.py
zhou@ubuntu:~/python/01-模块$ cat TestMsg/__init__.py
__all__ = ["sendmsg", "recvmsg"] #控制当前包里想要被导入的代码
from . import sendmsg #如果想直接import 包名,需要加入这一行;如果用from . import * 不用加这一行
zhou@ubuntu:~/python/01-模块$ ipython3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
Type "copyright", "credits" or "license" for more information.
IPython 5.5.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: import TestMsg
In [2]: TestMsg.sendmsg.test1()
-----test1-----
zhou@ubuntu:~/python/01-模块$ cat TestMsg/__init__.py
__all__ = ["sendmsg", "recvmsg"]
#from . import sendmsg #注销这一行后用import 包名,导入失败
zhou@ubuntu:~/python/01-模块$ ipython3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
Type "copyright", "credits" or "license" for more information.
IPython 5.5.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: import TestMsg
In [2]: TestMsg.sendmsg.test1()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-2-b0b1a37d886d> in <module>()
----> 1 TestMsg.sendmsg.test1()
AttributeError: module 'TestMsg' has no attribute 'sendmsg'
模块的制作和发布
zhou@ubuntu:~/python/02-模块发布$ cat TestMsg/__init__.py
__all__ = ["sendmsg", "recvmsg"]
from . import *
zhou@ubuntu:~/python/02-模块发布$ cat TestMsg/sendmsg.py
def test1():
print("-----test1-----")
zhou@ubuntu:~/python/02-模块发布$ cat TestMsg/recvmsg.py
def test2():
print("-----test2-----")
zhou@ubuntu:~/python/02-模块发布$ tree
.
├── setup.py
└── TestMsg
├── __init__.py
├── main.py
├── recvmsg.py
└── sendmsg.py
zhou@ubuntu:~/python/02-模块发布$ cat setup.py
from distutils.core import setup
setup(name="zzm", version="1.0", description="zzm's module", author="zzm", py_modules=['TestMsg.sendmsg', 'TestMsg.recvmsg'])
#py_modules后面的列表中需指明该包中需要包含哪些模块。
#构建模块
zhou@ubuntu:~/python/02-模块发布$ python3 setup.py build
running build
running build_py
creating build
creating build/lib
creating build/lib/TestMsg
copying TestMsg/__init__.py -> build/lib/TestMsg
copying TestMsg/sendmsg.py -> build/lib/TestMsg
copying TestMsg/recvmsg.py -> build/lib/TestMsg
zhou@ubuntu:~/python/02-模块发布$ tree
.
├── build
│ └── lib
│ └── TestMsg
│ ├── __init__.py
│ ├── recvmsg.py
│ └── sendmsg.py
├── setup.py
└── TestMsg
├── __init__.py
├── main.py
├── recvmsg.py
└── sendmsg.py
4 directories, 8 files
#生成发布压缩包
zhou@ubuntu:~/python/02-模块发布$ python3 setup.py sdist
running sdist
running check
warning: check: missing required meta-data: url
warning: check: missing meta-data: if 'author' supplied, 'author_email' must be supplied too
warning: sdist: manifest template 'MANIFEST.in' does not exist (using default file list)
warning: sdist: standard file not found: should have one of README, README.txt
writing manifest file 'MANIFEST'
creating zzm-1.0
creating zzm-1.0/TestMsg
making hard links in zzm-1.0...
hard linking setup.py -> zzm-1.0
hard linking TestMsg/__init__.py -> zzm-1.0/TestMsg
hard linking TestMsg/recvmsg.py -> zzm-1.0/TestMsg
hard linking TestMsg/sendmsg.py -> zzm-1.0/TestMsg
creating dist
Creating tar archive
removing 'zzm-1.0' (and everything under it)
zhou@ubuntu:~/python/02-模块发布$ tree
.
├── build
│ └── lib
│ └── TestMsg
│ ├── __init__.py
│ ├── recvmsg.py
│ └── sendmsg.py
├── dist
│ └── zzm-1.0.tar.gz
├── MANIFEST
├── setup.py
└── TestMsg
├── __init__.py
├── main.py
├── recvmsg.py
└── sendmsg.py
5 directories, 10 files
#安装制作好的模块
zhou@ubuntu:~/python/02-模块发布$ cp dist/zzm-1.0.tar.gz ~
zhou@ubuntu:~$ tar xf zzm-1.0.tar.gz
zhou@ubuntu:~$ cd zzm-1.0/
zhou@ubuntu:~/zzm-1.0$ tree
.
├── build
│ └── lib
│ └── TestMsg
│ ├── __init__.py
│ ├── recvmsg.py
│ └── sendmsg.py
├── PKG-INFO
├── setup.py
└── TestMsg
├── __init__.py
├── recvmsg.py
└── sendmsg.py
zhou@ubuntu:~/zzm-1.0$ cat PKG-INFO
Metadata-Version: 1.0
Name: zzm
Version: 1.0
Summary: zzm's module
Home-page: UNKNOWN
Author: zzm
Author-email: UNKNOWN
License: UNKNOWN
Description: UNKNOWN
Platform: UNKNOWN
zhou@ubuntu:~/zzm-1.0$ sudo python3 setup.py install
running install
running build
running build_py
running install_lib
creating /usr/local/lib/python3.6/dist-packages/TestMsg
copying build/lib/TestMsg/recvmsg.py -> /usr/local/lib/python3.6/dist-packages/TestMsg
copying build/lib/TestMsg/sendmsg.py -> /usr/local/lib/python3.6/dist-packages/TestMsg
copying build/lib/TestMsg/__init__.py -> /usr/local/lib/python3.6/dist-packages/TestMsg
byte-compiling /usr/local/lib/python3.6/dist-packages/TestMsg/recvmsg.py to recvmsg.cpython-36.pyc
byte-compiling /usr/local/lib/python3.6/dist-packages/TestMsg/sendmsg.py to sendmsg.cpython-36.pyc
byte-compiling /usr/local/lib/python3.6/dist-packages/TestMsg/__init__.py to __init__.cpython-36.pyc
running install_egg_info
Writing /usr/local/lib/python3.6/dist-packages/zzm-1.0.egg-info
#测试安装的模块
zhou@ubuntu:~/zzm-1.0$ cd
zhou@ubuntu:~$ ipython3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
Type "copyright", "credits" or "license" for more information.
IPython 5.5.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: import TestMsg
In [2]: TestMsg.sendmsg.test1()
-----test1-----
在程序中重新导入模块
In [5]: import TestMsg
In [6]: from imp import *
In [7]: reload(TestMsg)
Out[7]: <module 'TestMsg' from '/home/zhou/python/01-模块/TestMsg/__init__.py'>
from xxx import xxx
可以导入,函数,类,
实例:
目录结构
account.py
def login(): print('login') def logout(): print('logout') def register(): print('register')
导入方式一:
index.py
from lib import account account.login()
以上代码执行结果
login
导入方式二:
index.py
from lib.account import logout logout()
以上代码执行结果
logout
导入方式三:
index.py
from lib.account import logout as aaa aaa()
以上代码执行结果
logout
导入方式四:(不推荐)
index.py
import lib.account lib.account.login()
以上代码执行结果
login
导入目录:
目录结构:
__init__.py
def f1(): return 'F1'
test.py
from src import plugins ret = plugins.f1() print(ret)
以上代码执行结果
F1
添加sys.path路径
添加当前文件的上级目录路径到sys.path
import os,sys BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR)
拼接路径
import os,sys BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) print(BASE_DIR) print(os.path.join(BASE_DIR,'bin1','test.py'))
以上代码执行结果
F:\zhou\python\day1
F:\zhou\python\day1\bin1\test.py
__name__ 是当前模块名,当模块被直接运行时模块名为 __main__ 。
if __name__ == '__main__' xxxx
以上代码的意思是,当模块被直接运行时,代码块xxxx将被运行,当模块是被导入时,代码块不被运行。