模块
到目前为止,我们在 Python 解释器中写的所有代码都在我们退出解释器的时候丢失了。但是当人们编写大型程序的时候他们会倾向于将代码分为多个不同的文件以便使用,调试以及拥有更好的可读性。在 Python 中我们使用模块来到达这些目的。模块是包括 Python 定义和声明的文件。文件名就是模块名加上 .py 后缀。
你可以由全局变量 name 得到模块的模块名(一个字符串)。
现在我们来看看模块是怎样工作的。创建一个 bars.py 文件。文件内容如下:
[root@izwz9eitqs320brxl6owssz ~]# vi bars.py
#! /usr/bin/python3
"""
Bars Module
==============
这是一个打印不同分割线的示例模块
"""
def starbar(nums):
print('*'*nums)
def hasbar(nums):
print('#'*nums)
def simplebar(nums):
print('-'*nums)
- 结果:
----启动导入模块
>>> import bars
>>> bars.hasbar(15)
###############
>>> bars.simplebar(15)
---------------
>>> bars.starbar(15)
***************
>>>
包
含有 init.py 文件的目录可以用来作为一个包,目录里的所有 .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
...
当导入包,py通过sys.path搜索目录寻找包的子目录。
init.py文件使得python处理目录就像包含包一样。目的是为了防止目录出现string的普通名称。普通的init文件中可以是一个空文件,也可以初始化为整个包伙食设置all变量 之后再描述。
- 用户的包可以导入单独的模块 如下所示:
import sound.effects.echo
- 但是必须要引用为全名:
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
- 导入方式2:
from sound.effects import echo
- 但是在引用的时候 不需要前缀 可以这么被使用:
echo.echofilter(input, output, delay=0.7, atten=4)
- 导入方式 3:
from sound.effects.echo import echofilter
- 引用的方式 使用echofilter直接有效:
echofilter(input, output, delay=0.7, atten=4)
- import * from a package:
例子:在from sound.effects import * 中 需要在init.py中定义all中模块名称,例如:
sound/effects/__init__.py中包含以下代码:
__all__ = ["echo", "surround", "reverse"]
表示可以导入三个子模块
如果all没有定义 from sound.effects import * 没有导入所有的子模块 从包sound.effects中,可以这么导入
import sound.effects.echo
import sound.effects.surround
from sound.effects import *
本节实验将创建下面的 mymodule 目录,目录结构如下:
[root@izwz9eitqs320brxl6owssz home]# tree mymodule/
mymodule/
├── bars.py
├── __init__.py
├── __init__.pyc
├── __pycache__
│ ├── bars.cpython-36.pyc
│ └── __init__.cpython-36.pyc
└── utils.py
[root@izwz9eitqs320brxl6owssz mymodule]# vi __init__.py
from mymodule.bars import simplebar
__all__ = [simplebar, ]
>>> from mymodule import simplebar
>>>
----------------------
import * 会报错
>>>> from mymodule import *
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<frozen importlib._bootstrap>", line 1019, in _handle_fromlist
File "<frozen importlib._bootstrap>", line 1014, in _handle_fromlist
TypeError: Item in mymodule.__all__ must be str, not function
>>>
OS模块
OS模块参考资料 在这里阅读相关内容
requests模块
Requests 是一个第三方 Python 模块,其官网的介绍如下:
Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。
警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。
- 1.download requests
[root@izwz9eitqs320brxl6owssz mymodule]# pip3 install requests
- 获得一个简单的网页
>>> import requests
>>> req = requests.get('http://github.com')
>>> req.status_code
200
写一个能够从指定的 URL 中下载文件的程序
#!/usr/bin/env python3
import os
import os.path
import requests
def download(url):
req = requests.get(url)
#首先我们检查是否存在文件
if req.status_code == 404:
print('No such file found at %s' % url)
return
filename = url.split('/')[-1]
with open(filename, 'wb') as fobj:
fobj.write(req.content)
print("Download over.")
if __name__ == '__main__':
url = input('Enter a URL: ')
download(url)
可能已经注意到了 if name == ‘main‘: 这条语句,它的作用是,只有在当前模块名为 main 的时候(即作为脚本执行的时候)才会执行此 if 块内的语句。换句话说,当此文件以模块的形式导入到其它文件中时,if 块内的语句并不会执行
argparse命令行参数
sys,命令行传入的所有参数都可以使用 sys.argv 获取。如果希望对参数进行处理可以使用 argparse 模块,阅读这篇 文档 学习
TAB补全
创建一个文件:~/.pythonrc
import rlcompleter, readline
readline.parse_and_bind('tab: complete')
history_file = os.path.expanduser('~/.python_history')
readline.read_history_file(history_file)
import atexit
atexit.register(readline.write_history_file, history_file)
EXPORT
export PYTHONSTARTUP=~/.pythonrc