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:忽略依赖关系。
相关文章
相关标签/搜索