Python 内置了一个下载服务器就可以显著提高效率了 。 例如, 你的同事要让你传的文件位于某一个目录下,那么,你能够进入这个目 录 , 而后执行下面的命令启动一个下载服务器 :html
Python2实现: python -m SimpleHTTPServer Python3实现: 在 Python 3 中,因为对系统库进行了从新整理,所以,使用方式会有不一样: python -m http.server
执行上面的命令就会在当前目录下启动一个文件下载服务器, 默认打开 8000 端口 。 完成之后,只须要将 IP 和端口告诉同事,让同事本身去操做便可,很是方便高效 。python
效果以下:git
注意:若是当前目录下存在一个名为 index .html 的文件,则 默认显示该文件的内容 。 若是当前目录下不存在这样一个文件,则默认显示当前目录下的文件列表。github
需求:在工做过程当中,咱们的系统会调用底层服务的 API。底层服务的 API通常都以 JSON 的格式返回,为了便于问题追踪,咱们会将 API 返回的 JSON 转换为字符串记录到日志文件中。 当须要分析问题时,就须要将日志文件中的 JSON 字符串拿出来进行分析 。这个时候,须要将一个 JSON 字符串转换为 JSON 对象,以提升日志的可读性 。web
解决:这个需求十分常见,以致于使用搜索引擎搜索 叮SON”,处于搜索结果的第一项即是“在线 JSON 格式化工具” 。 除了打开浏览器,使用在线 JSON 格式化工具之外,咱们也可使用命令行终端的 Python 解释器来解析 JSON 串,以下所示:macos
# echo '{" job":" developer"," name":" lmx"," s ex":"male " }' |python -m json.tool { " job": " developer", " name": " lmx", " s ex": "male " }
使用命令行解释器解析JSON 串很是方便,并且,为了便于阅读,该工具还会自动将转换的结果进行对齐和格式化。 以下所示:编程
# echo '{"signing": { "default": { "expiry": "8760h" }, "profiles": { "kubernetes-Soulmate": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "8760h" } } } }'|python -m json.tool { "signing": { "default": { "expiry": "8760h" }, "profiles": { "kubernetes-Soulmate": { "expiry": "8760h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } }
进入https://pypi.python.org/pypi/pip,下载第二项。json
解压下载的文件(windows下只用解压工具解压如RAR,Linux下终端输入tar -xf pip-10.0.1.tar.gz,即tar -xf 文件名),进入解压后的文件夹中,调出命令行窗口或者终端flask
wget https://files.pythonhosted.org/packages/ae/e8/2340d46ecadb1692a1e455f13f75e596d4eab3d11a57446f08259dee8f02/pip-10.0.1.tar.gz tar xf pip-10.0.1.tar.gz cd pip-10.0.1/ ##Linux下操做用户是普通用户须要sudo受权操做 python setup.py install ##查看版本信息 pip -v
若安装报下面的错误vim
# python setup.py install Traceback (most recent call last): File "setup.py", line 6, in <module> from setuptools import setup, find_packages
解决办法以下(完美解决问题)
wget http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg
sh setuptools-0.6c11-py2.7.egg
pip search flask
pip install flask==0.8
pip uninstall Werkzeug
pip show flask
pip check flask
pip list (-o 查询可升级的包)
pip freeze
pip freeze > requirements.txt
pip install -r requirements.txt
pip completion --bash >~/.profile
$ source ~/.profile
pip install <包名> -d <目录> 或 pip install -d <目录> -r requirements.txt
pip wheel <包名>
pip install -U <包名>
或:pip install <包名> --upgrade
pip install -U pip
使用Python时间比较长的话,会发现 Python 安装的一个问题,即 pypi.python.org 不是特别稳定,有时候会很慢,甚至处于彻底不可用的状态。
咱们国内目前有多个pypi镜像,推荐使用豆瓣的镜像源或阿里的镜像源。
国内的镜像源地址: 阿里:https://mirrors.aliyun.com/pypi/simple 豆瓣:http://pypi.douban.com/simple 中国科学技术大学:http://pypi.mirrors.ustc.edu.cn/simple/
单次使用安装源:若是要使用第三方的源,只须要在安装时,经过 pip 命令的-i 选项指定镜像源便可。以下所示:(包名放置先后都可)
pip install -i http://pypi.douban.com/simple flask
指定全局安装源
在unix和macos,配置文件为:$HOME/.pip/pip.conf
在windows上,配置文件为:%HOME%\pip\pip.ini
[global] timeout = 6000 index-url = http://pypi.douban.com/simple
若是须要对大批量的服务器安装软件包,而且安装包比较多或者比较大,则能够考虑将软件包下载到本地,而后从本地安装。 这对于使用脚本部署大量的服务器很是有用 ,此外,对于服务器没法链接外网的状况,也可使用这种方法。以下所示:
下载到本地
pip install download='pwd' -r requirements.txt
本地安装
pip install --no-index -f file.//'pwd' -r requirements.txt
使用这种方式,只须要下载一次,就能够多处安装,不用担忧网络不稳定的问题 。 例如,咱们经过这种方式下载 Flask 到当前目录下,则 Flask 的 依赖 click 、itsdangerous 、 Jinja二、Markup Safe 和 Werkzeug 也会被下载到本地。
pip install --download='pwd' flask
vim是一个功能强大、高度可定制的文本编辑器,与Emacs一块儿成为Linux下最著名的文本编辑器。
vim最强大的地方在于快速移动和高度可定制,因此使用vim编写Python代码时,只须要进行简单的定制就可以大幅提升编码效率。
一键执行功能不是一个插件,而是自定义的vim配置。若是咱们写的Python代码是一些较为简单的脚本,那么,这个一键执行的功能会很是实用。将下面的配置放在vim的配置文件当中,编写完Python代码之后,按F5就实现了一键执行功能。该功能最实用的是编写单元测试,写完测试不用退出vim,当即执行就能看到结果,很是方便。
配置链接地址:https://blog.csdn.net/u010871058/article/details/54253774
vimPython配置版:https://www.cnblogs.com/cjy15639731813/p/5886158.html
代码补全可以显著减小敲键的次数,将咱们从琐碎的语法中解放出来。绝不夸张地说,代码补全插件可以帮咱们写一半的代码。例如,使用snipmate插件,输入ifmain后按tab键将会自动生成下面的代码:
Syntastic是一款强大的语法检查插件,当咱们保存源文件时,它就会执行。执行完之后,会提示咱们哪些代码存在语法错误,哪些代码不符合编码规范,并给出具体的提示信息。例如,Python代码风格默认设置为PEP8,即便咱们不太了解PEP8的代码风格,只要使用了Syntastic插件,并根据它给出的提示进行修改,就可以写出彻底符合PEP8风格的代码。
jedi-vim是基于jedi的自动补全插件,与snipmate不一样的是,该插件更加智能。jedi-vim更贴切的称呼是“编程提示”,而不是代码补全插件。须要注意的是,使用jedi-vim插件前须要在电脑中安装jedi。这个插件是Python的标配。
jedi是一个自动补全和静态分析的Python库,直接使用pip安装便可:
pip install jedi
使用jedi-vim编写Python的代码效果图
PyCharm是由JetBrains打造的一款功能强大的Python IDE 也是目前最流行的 Python IDE。JetBrains是捷克一家软件开发公司,该公司最为人熟知的产品是一款名为 IntelliJ IDEA的Java IDE 。IntelliJ IDEA是Eclipse最大的竞争对手,而且,很多资深的软件工程师 都认为,IntelliJ IDEA 比 Eclipse更加智能、更加好用。能够看到,JetBrains 算得上是一家历史悠久的开发编辑器的公司,正由于该公司在编辑器领域的多年沉淀、对编辑器的易用性有深入的理解和独到的看法,使得PyCharm一经推出就受到了Python工程师的普遍关注 。
PyCharm是一款很现代的编辑器,几乎包含了全部现代编辑器应有的功能:
Python 官方给出的编码规范 PEP 8 ,而后介绍检查代码是否符合规范的工具 pycodestyle ,以及能够将代码风格格式化成 PEP 8 的 autopep8 。
Python代码给人的第一印象就是颜值高、简洁优美、可读性强。这一方面是由于Python语言自身的优秀设计,如经过统一的缩进来表示代码块,经过减小多余的符号使得代码更加简洁;另外一方面是由于Python代码有着较为统一的编码风格。
PEP 8自己只是编码风格方面的建议,并不强制工程师遵循。可是,因为该建议被Python工程师普遍接纳,所以,它已经成为了事实上的标准。
PEP8编码规范详细地给出了Python编码的指导,包括对齐规则、包的导人顺序、空格与注释、命名习惯和异常处理等Python编程的方方面面,而且提供了详细的示例。
官网手册:https://www.python.org/dev/peps/pep-0008/
中文手册:https://blog.csdn.net/ratsniper/article/details/78954852
在Python2中,相对导入又能够分为显式相对导入和隐式相对导入,而在Python3中,已经弃用了隐式相对导入。
Python中支持相对导人和绝对导人,推荐使用绝对导人。由于绝对导人可读性更好,也不容易出锚,即便出错也会给出更加详细的错误信息。
Python官方的代码规范称为PEP8,这个检查代码风格的命令行工具叫阴间,很容易引发困惑。所以,Python之父提议将pep8这个命令行工具重命名为 pycodestyle。
pip install peps
pip install pycodestyle
方式一: pycodestyle --first optparse.py 方式二: pep8 optparse.py
pycodestyle --show-source --show-pep8 test.py
autopep8是一个开源的命令行工具,它可以将Python代码自动格式化为PEP8风格。autopep8使用pycodestyle工具来决定代码中的哪部分须要被格式化,这可以修复大部分pycodestyle工具中报告的排版问题。autopep8自己也是一个Python语言编写的工具。
pip install autopep8
autopep8 --in-place optparse.py
--in-place参数相似于sed的-i参数,直接将修改结果保存到源文件中。若不加--in-place则只将结果输出到控制台,不修改源文件。
autopep8 还存在--aggressive选项,使用该选项会执行更多实质性的更改,能够屡次使用以达到更佳的效果
Python2和Python3之间存在着较大的差别,而且,因为各类缘由致使了Python2和Python3的长期共存。在实际工做过程当中,咱们可能会同时用到Python2和Python3,所以,须要常常在Python2和Python3之间进行来回切换。
这涉及到两个工具:pyenv和virtualenv。pyenv用于管理不一样的Python版本,virtualenv用于管理不一样的工做环境。
部署应用:https://blog.csdn.net/lyintong/article/details/68491351
pyenv用以管理不一样的Python版本,例如,你的系统工做时使用Python2.7.13,学习时使用Python3.6.0。
virtualenv用以隔离项目的工做环境,例如,项目A和项目B都是使用Python2.7.13,可是,项目A须要使用Flask0.8版本,项目B须要使用Flask0.9版本。
咱们只要组合pyenv和virtualenv这两个工具,就可以构造Python和第三方库的任意版本组合,拥有很好的灵活性,也避免了项目之间的相互干扰。
virtualenv自己是一个独立的工具,用户能够不使用pyenv而单独使用virtualenv。可是,若是你使用了pyenv,就须要安装pyenv-virtualenv插件,而不是经过virtualenv软件使用virtualenv的功能。
pyenv是一个Python版本管理工具,它可以进行全局的Python版本切换,也能够为单个项目提供对应的Python版本。使用pyenv之后,能够在服务器上安装多个不一样的Python版本,也能够安装不一样的Python实现。不一样Python版本之间的切换也很是简单。
一、选择安装到$HOME/.pyenv目录 git clone https://github.com/yyuu/pyenv.git ~/.pyenv
2、配置环境变量 echo 'export PYENV_ROOT="$HOME/.pyenv"' >> /etc/profile echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >>/etc/profile
三、使环境变量当即生效 source /etc/profile
1、查看一下有哪些版本的python 能够安装 pyenv install --list 2、安装指定版本的Python pyenv install -v 2.7.1 pyenv install -v 3.6.1 3、卸载指定版本的Python pyenv uninstall 2.7.1 4、查看全部的Python版本 pyenv versions 5、查看当前操做的Python版本 pyenv version
注意:
virtualenv 自己是一个独立的项目,用以隔离不一样项目的工做环境 。
用户需求:用户但愿在项目A中使用Flask0.8这个版本,与此同时,又想在项目B中使用Flask0.9这个版本。若是咱们全局安装Flask,必然没法知足用户的需求。这个时候,咱们就可使用virtualenv。
咱们只要组合pyenv和virtualenv这两个工具,就可以构造Python和第三方库的任意版本组合,拥有很好的灵活性,也避免了项目之间的相互干扰。
virtualenv自己是一个独立的工具,用户能够不使用pyenv而单独使用virtualenv。可是,若是你使用了pyenv,就须要安装pyenv-virtualenv插件,而不是经过virtualenv软件使用virtualenv的功能。
git clone https://github.com/yyuu/pyenv-virtualenv.git echo 'eval "$( pyenv virtualenv - init -) "'>>/etc/profile source /etc/profile
有了pyenv-virtualenv之后,咱们能够为同一个Python解释器,建立多个不一样的工做环境。例如,咱们新建两个工做环境:
pyenv virtualenv 2.7.13 first_project
pyenv virtualenv 2.7.13 second_project
使用virtualenvs指明了查看工做环境
pyenv virtualenvs
进入/退出/删除virtualenv虚拟环境
1、activate进入一个工做环境 pyenv activate first_project 2、deactivate退出一个工做环境 pyenv deactivate first_project
三、virtualenv-delete删除虚拟环境
pyenv virtualenv-delete first_project
中文文档:https://www.kancloud.cn/manual/jinja2/70423
模板在Python的web开发中普遍使用,它可以有效地将业务逻辑和页面逻辑分离,使得工程师编写出可读性更好、更加容易理解和维护的代码。
web开发是最须要使用模板的地方,可是,并非惟一可使用模板的地方。模板使用范围比大多数工程师接触的都要普遍,由于模板适合全部基于文本的格式,如HTML,XML,CSV,LaTeX等。
使用模板可以编写出可读性更好、更容易理解和维护的代码,而且使用范围很是普遍,所以怎么使用模板主要取决于工程师的想象力和创造力。例如,本书第十章即将介绍的Ansible就使用Jinja2来管理配置文件。
做为工程师,咱们也可使用Jinja2管理工做中的配置文件。一旦学会使用模板管理配置文件,就能够摆脱无数琐碎的文本替换工做。
Python自带的模板功能很是有限,例如没法在模板中使用控制语句和表达式,不支持继承和重用等操做。这对于web开发来讲远远不够,所以,出现了第三方的模板系统。目前市面上有很是多的模板系统,其中最知名的是Jinja2和Mako。
Jinja2是Flask做者开发的一个模板系统,起初是仿Django模板的一个模板引擎,为Flask提供模板支持。可是,因为其灵活、快速和安全等优势被普遍使用。
pip install jinja2
在jinja2中,存在三种语法:
1 控制结构 {% %} 2 变量取值 {{ }} 3 注释 {# #}
范例
{% block body %} <ul> {% for user in users %} <li><a href="{{ user.url }}">{{ user.username }}</a></li> {% endfor %} </ul> {% endblock %}
Jinja2模板中使用的 {{ }} 语法表示一个变量,它是一种特殊的占位符,告诉模板引擎这个位置的值在渲染模板时获取。Jinja2识别全部的Python数据类型,甚至是一些复杂的类型,如列表、字典和对象等
变量能够经过“过滤器”进行修改,过滤器能够理解为是Jinja2里面的内置函数和字符串处理函数。
Jinja2比较经常使用的过滤器:
在Jinja2中,变量能够经过“过滤器”修改,过滤器与变量用管道(|)分割。多个过滤器能够链式调用,前一个过滤器的输出会做为后一个过滤器的输入。以下所示:
Jinja2中的if语句相似于Python中的if语句,可是,须要使用endif语句做为条件判断的结束。咱们可使用if语句判断一个变量是否认义,是否为空,是否为真值。与Python中的if语句同样,也可使用elif和else构建多个分支,以下所示:
Jinja2中的for语句可用于迭代Python的数据类型,包括列表、元组和字典。在Jinja2中不存在while循环,这也符合了Jinja2的“提供仅有的控制结构,不容许在模板中编写太多的业务逻辑,避免了工程师乱用行为”设计原则。
除了基本的for循环使用之外,Jinja2还提供了一些特殊的变量,咱们不用定义就能够直接使用这些变量。列出了Jinja2循环中能够直接使用的特殊变量。
Jinja2宏的简单使用:http://makaidong.com/printN/3301_768547.html
Jinja2宏问题解决:https://blog.csdn.net/qq_34062683/article/details/78234695
在宏的定义中,使用macro关键字定义一个宏,input是宏的名称。它有三个参数,分别是name,type和value,其中type和value参数有默认值。能够看到宏的定义与Python的函数定义很是类似,此外,它与Jinja2中的for循环和if语句同样,不须要使用复合语句的冒号,使用endmacro结束宏的定义。
下面是宏的调用,与函数调用相似:
import jinja2 rules={ "name":"xxxxxxx", "rules":[ { "alert": "z1", "expr": "up == 0", "duration": "1m", "enable": 1, "labels":{"labels1":"label1","label2":"label2"}, "annotations":{"annotations":"annotations"} }, { "alert": "z2", "expr": "up == 0", "duration": "1m", "enable": 1, "labels":{"label1":"label1","label2":"label2"}, "annotations":{"annotation1":"annotation1", "annotation2":"annotation2"} } ], "desc":"group DESC NEW1" } RENDER_RULES_TEMPLATE = """groups: - name: {{ rules.name }} rules: {%- for alert in rules.rules %} - alert: {{ alert.alert }} expr: {{ alert.expr}} for: {{ alert.duration }} labels: {%- for item in alert.labels %} {{ item }}: {{ alert.labels[item] }} {%- endfor %} annotations: {%- for item in alert.annotations %} {{ item }}: {{ alert.annotations[item] }} {%- endfor %} {% endfor %} """ result = jinja2.Template(source=RENDER_RULES_TEMPLATE).render(rules=rules) with open('result.yml','w') as fp: fp.write(result)
若只是使用Jinja2进行配置文件管理,基本用不到Jinja2的继承功能。若使用Jinja2进行web开发。
Jinja2中最强大的部分就是模板继承。模块继承容许你构建一个包含站点共同元素的基本模板“骨架”,并定义子模块能够覆盖的块。
文件打开的模式
操做示例
f = open('data1.txt','w',encoding='utf-8') # print(f.read()) f.write('hello, world') f.close()
使用try....finally
try: f = open('data.txt',encoding='utf-8') print(f.read()) finally: f.close()
对于文件打开、处理、再关闭的逻辑,使用上下文管理器的代码(使用with语句):
with open('data.txt',encoding='utf-8') as f: print(f.read())
Python的文件对象有多种类型的函数,如刷新缓存的flush函数,获取文件位置的tell函数,改变文件读取偏移量的seek函数。
read 函数和 readlines 函数都是一次就将全部内容读入到内存中 。处理的是小文件仍是能够的,若大文件,占用内存太多,甚至会出现Out-Of-Memory错误。因此避免这样操做。
在Python中,除了使用文件对象的write函数和writelines函数向文件写入数据之外,也可使用print函数将输出结果输出到文件中。print函数比write和writelines函数更加灵活。
# 导入功能模块
from __future__ import print_function with open('data.txt','w') as f: print(1, 2, 'hello world', sep=",", file=f)
Python的for循环不但能够遍历如字符串、列表、元组这样的可迭代徐磊,还可使用迭代器协议遍历可迭代对象。Python的文件对象实现了迭代器协议。
with open('data.txt') as inf: for line in inf: print(line.upper())
with open('data.txt') as inf, open('out.txt', 'w') as outf: for line in inf: outf.write(" ".join([word.capitalize() for word in line.split()])) outf.write("\n")
from __future__ import print_function with open('data.txt') as inf, open('out_print.txt', 'w') as outf: for line in inf: print(*[word.capitalize() for word in line.split()], file=outf)
详情见Python的os模块:http://www.cnblogs.com/happy-king/p/7704487.html#_label4
当咱们在Shell中输入命令并执行时,有很是多的快捷键能够提升咱们的工做效率。例如,咱们能够在Bash中使用ctrl+r搜索曾经执行过的Linux命令,之因此可使用ctrl+r搜索曾经执行过的Linux命令是由于Bash跟踪用户以前输入过的命令,并将其保存在~./bash_history文件中。咱们可使用history命令或者直接读取~./bash_history文件的内容来查看命令历史。
搜索历史命令的快捷键:ctrl+r
统计每条命令的出现次数,而后找出出现次数最多的10条命令。
1 import os 2 from collections import Counter 3 4 c = Counter() 5 with open(os.path.expanduser('~/.bash_history')) as f: 6 for line in f: 7 cmd = line.strip().split() 8 if cmd: 9 c[cmd[0]] += 1 10 11 12 CmdCount=c.most_common(10) 13 print(CmdCount)
系统管理员在管理服务器时,可能会有这样的疑问:
filecmp模块最简单的函数是cmp函数,该函数用来比较两个文件是否相同,若是文件相同,返回True,不然返回False。
cmpfiles函数用来同时比较两个不一样目录下的多个文件,而且返回一个三元组,分别包含相同的文件、不一样的文件和没法比较的文件。
cmpfiles函数用来同时比较两个目录下的文件,也可使用该函数比较两个目录。可是,在比较两个目录时须要经过参数指定全部可能的文件,显然比较繁琐。
调用dircmp函数之后会返回一个dircmp类的对象,该对象保存了诸多属性,工程师能够经过读取这些属性的方式获取目录之间的差别。
filecmp 模块的 dircmp 函数仅仅比较目录下面的文件和子目录 ,可是,并不会递归比较子目录的内容 。 对于目录, dircmp 函数也仅仅是比较函数的名称 ,不会去比较子目录里面的内容。
shutil模块:http://www.cnblogs.com/happy-king/p/7704487.html#_label6