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