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声明的名称,不提供参数的情况下会返回当前文件的声明信息。


   作为脚本执行

    module本身就可以作为python脚本执行,命令行中通过python module.py可以直接执行module,除此以外在import时如果被引入的module中有独立的代码(即不是class或者function的定义)也会被执行。如果希望只在作为独立脚本是被执行,可以写成如下:

?
1
2
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会优先加载。

与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会被引入。

?
1
2
__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:

?
1
2
3
4
#打包
pip wheel - - wheel - dir = / your_wheel_directory - r requirement.txt
#安装
pip install - - no - index - - find - links = / your_wheel_directory - r requirement.txt



    pip支持从本地文件进行安装,对于重复安装的场景免除了每次网络传输的开销,通过下面命令自动下载打包安装文件和进行安装: 
?
1
2
3
4
#下载
pip install - - download < DIR > - r requirements.txt
#安装
pip install - - no - index - - find - links = [ file : / / ]< DIR > - r requirements.txt



    pip通过list命令查看已经安装的package或者是过期的package,通过show命令查看文件的详细信息。 
?
1
2
3
4
5
6
#查看已经安装的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如果有新版也会被同时更新,即便现有的版本已经满足需求,不希望递归更新时使用命令:
?
1
2
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的配置可以分为两个作用范围:整体和子命令。比如:

?
1
2
3
4
5
[global]
timeout = 60
 
[freeze]
timeout = 10



    global规定pip连接的超时时间是60秒,而freeze模块(即requirement file)的超时时间是10秒。除此之外pip的配置还可以通过环境变量和命令行参数传递,三者的优先级是:命令行参数>环境变量>配置文件。比如timeout参数还可以通过下面途径设置: 
?
1
2
3
4
#设置环境变量
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:忽略依赖关系。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值