Python中的Modules和pip

Modules

   
對module的理解

     和Java中一個類就是一個文件不一樣(固然不考慮內部類),python中一個.py文件能夠包含多個class。Modules的目的是代碼的劃分、管理以及代碼重用。一個module是一個包含了定義和代碼的文件,我的認爲module包含了針對功能的相關代碼,在一個module中能夠存在多個類、函數甚至是須要預執行的腳本。



   compile&cache

    爲了加快加載速度python會緩存.py文件,在__pycache__指定的目錄中緩存文件按照「module.version.pyc」的名稱保存,其中version部分是python的版本信息,這樣使得不一樣版本的緩存能夠共存。在引入module時python會檢查是否存在緩存和緩存版本是否過時。可是如下兩種狀況,python不會加載緩存文件:
  • command line中執行python時每次都會從新編譯,不會嘗試加載。
  • 不存在源文件時,python不會直接從緩存中加載*.pyc文件。
    python是腳本語言可是存在一個「編譯」的概念,其實python的編譯時去除了代碼中非必須的部分——assert和__doc__部分。「編譯」並非回想Java那樣進行代碼優化,「編譯」的目的在於加快module加載的速度。編譯時使用參數-O會忽略掉assert部分,使用-OO會同時忽略assert和__doc__,優化過的代碼會保存爲*.pyo的文件。


   dir

    dir()是python中內置的命令返回一個字符串數組,能夠用來查看一個module聲明的名稱。經過dir(module_name)查看一個module聲明的名稱,不提供參數的狀況下會返回當前文件的聲明信息。 html


   做爲腳本執行

    module自己就能夠做爲python腳本執行,命令行中經過python module.py能夠直接執行module,除此之外在import時若是被引入的module中有獨立的代碼(即不是class或者function的定義)也會被執行。若是但願只在做爲獨立腳本是被執行,能夠寫成以下: python

if __name__ == '__main__':
    print('your code.')


Module的查找路徑

    python會經過兩個地方查找被引入的module——builtins和sys.path。builtins是python內置的標準函數庫,可能因不一樣的平臺而有所不一樣,sys.path則分爲項目目錄和PYTHONPATH兩部分。當一個module被引入時,python先查找builtins,若是沒有找到則嘗試在當前目錄查找,若是仍然沒有則查找PYTHONPATH也就是python的site-package目錄。所以若是在項目目錄中聲明瞭和PYTHONPATH中同名的module,那麼項目目錄中的module會優先加載。 shell

與package關係

    python中的package就是代碼在的目錄路徑,經過"."的表達式標識。在pythong中能夠經過from aaa.bbb import ccc和import aaa.bbb.ccc或者fromaaa import bbb.ccc來達到引入ccc的目的,不一樣之處是import以後的內容在使用時須要提供全名稱,也就是上述三種寫法在使用時分別要調用:ccc.fun()、aaa.bbb.ccc.fun()、bbb.ccc.fun()。
    package所在的目錄須要包含一個空文件__init__.py來代表這個是一個python package,同時在__init__.py文件中能夠聲明一些描述性的代碼來變動package的特性。好比針對import *的__all__,正常狀況下咱們寫from aaa.bbb import *會引入位於aaa/bbb目錄下的全部modules——這是一個很差的實踐,由於有些東西可能會有反作用。特別的若是某個package下有你明確不但願被引用的py文件,能夠經過__all__明確說明哪些是但願引入的,這樣在python處理import *時會忽略掉不在__all__列表的內容。以下面的__init__.py指明瞭在import *時只有persons這個module會被引入。 django

__author__ = 'Administrator'
__all__ = ['persons',]




Pip

    pip是用於安裝PyPI中所列出的package的工具。PyPI即Python Package Index,是python提供的一個lib的在線倉庫相似於Java的maven。pip的功能包括幾方面:安裝、卸載、升級、查看和本地安裝、配置。 數組

  Install、List、Local Install、Search

    pip用於安裝package的命令install,使用命令pip install somepackage完成安裝。通常狀況下pip會選擇最新的版本安裝,能夠經過參數version指定但願的package版本。除了單個package的安裝pip還能夠經過requirement file進行批量安裝,命令:pip install -r requirement.txt。requirement file自己就是一個包含多個package列表文本文件,而且能夠接受version等參數。使用requirement file的目的包括: 緩存

  • 可重複安裝,對於團隊的生產環境須要安裝統一的配置,能夠直接用requirement file搞定。
  • 解決依賴,pip默認安裝最新的版本,可是多個package之間可能須要特定的版原本相互配合,能夠把構建好的環境整理成requirement file。
  • 安裝特定的版本,好比新的版本可能引入了bug或者衝突,因此使用requirement file來指定一個版本。
  • 自定義源文件的安裝,軟件中存在bug而且你已經等不及原做者去修復了。你本身修復後可使用requirement file指定某一package從特定路徑安裝。

    pip還支持wheel格式的安裝,wheel是一種package的壓縮格式要比經過源碼的安裝快速,默認狀況下pip優先選擇wheel格式安裝,只有在沒法找到wheel文件時纔會從源文件安裝。wheel是pip的一個模塊,經過一下命令能夠把源文件打包成wheel和從指定wheel文件安裝package: 網絡

#打包
pip wheel --wheel-dir=/your_wheel_directory -r requirement.txt
#安裝
pip install --no-index --find-links=/your_wheel_directory -r requirement.txt



    pip支持從本地文件進行安裝,對於重複安裝的場景免除了每次網絡傳輸的開銷,經過下面命令自動下載打包安裝文件和進行安裝:
#下載
pip install --download <DIR> -r requirements.txt
#安裝
pip install --no-index --find-links=[file://]<DIR> -r requirements.txt



    pip經過list命令查看已經安裝的package或者是過時的package,經過show命令查看文件的詳細信息。
#查看已經安裝的package
pip list
#查看過時的package
pip list --outdated
#查看某個package的詳細
pip show Django



    pip提供了search命令用來查找PyPI中的package信息,如pip search django。


Uninstall、Upgrade

        須要刪除一個package使用命令pip uninstall package_name便可,一樣的須要升級一個package也能夠經過命令pip upgrade package_name實現。須要注意的是pip的upgrade命令是遞歸的,也就是新版本的package所依賴的sub_package若是有新版也會被同時更新,即使現有的版本已經知足需求,不但願遞歸更新時使用命令:
pip install --upgrade --no-deps SomePackage
pip install SomePackage



    第一行的命令會更新package可是不會安裝依賴,第二行命令會按照SomePackage須要的可是沒有安裝的package。

Configuration

    不一樣的操做系統平臺pip的安裝文件位置有所不一樣,Linux和MacOS中位於%HOME%/pip/pip.conf,Windows下位於%HOME/pip/pip.ini。pip的配置能夠分爲兩個做用範圍:總體和子命令。好比: maven

[global]
timeout = 60

[freeze]
timeout = 10



    global規定pip鏈接的超時時間是60秒,而freeze模塊(即requirement file)的超時時間是10秒。除此以外pip的配置還能夠經過環境變量和命令行參數傳遞,三者的優先級是:命令行參數>環境變量>配置文件。好比timeout參數還能夠經過下面途徑設置:
#設置環境變量
export PIP_DEFAULT_TIMEOUT=60
#命令行參數
pip --default-timeout=60 [...]



    經常使用的pip參數有:
  • timeout:設置超時時間
  • index-url:指定PyPI的基路徑。
  • find-links <url>:設置package所在的路徑,若是url執行html文件那麼解析這個文件,若是url是"file://"那麼在url指定目錄的文件列表裏查找。
  • no-index:忽略index,只在find-links時使用。
  • ignore-installed:強制安裝,即使已經安裝了。
  • no-deps:忽略依賴關係。
相關文章
相關標籤/搜索