Pip-pop

pip-grep主要是用于方便查看Requirements.txt中那些模块是安装了的。也就是通过输入的然后模块名称然后在Requirements.txt中进行查询。里面比较难的就是docopt这个模块。

docopt:

docopt
本质上是在 Python
中引入了一种针对命令行参数的形式语言,在代码的最开头使用
"""
"""文档注释的形式写出符合要求的文档,就会自动生成对应的parse。来看下具体使用的例子:

"""

Usage:

func_test1.py
para <abc>

func_test1.py
[-vc] <content>

func_test1.py
[-f] [FILE] ...

Options:

-h
--help

-v
--version

-c
--control

-f
--file_name

"""

from
docopt import docopt

if
__name__=="__main__":

argu=docopt(__doc__)

print(argu['FILE'])

1
首先构造__doc__的内容,也就是程序开头”””
”””的内容

2
构造Usage,所谓的Usage就是使用方法的格式,docopt会根据Usage里面的格式来解析命令行。格式第一个参数是func_test1.py,
这个就是文件名。第二个参数有集中形式,首先来看func_test1.py
para <pa> 这个para没有任何括号包含,证明是必须要带的选项。

使用的命令
python3
func_test1.py para abc, 此时命令匹配到func_test1.py
para <pa> 尖括号包括起来的pa就是要被赋值的参数,此时pa=abc

接来下再看func_test1.py
[-vc] <content>的格式,此时有括号将-vc包含起来,说明-vc是可选的,-vc也就是-v
-c 这两个参数必须包含在Options中。

使用的命令

python3
func_test1.py -vc python 或者是python3
func_test1.py python

最后来看func_test1.py
[-f] [FILE] ... 的格式,此时有一个...代表元素可以重复出现,最后解析的结果是一个列表。

使用的命令

python3
func_test1.py -f 1.txt 2.txt

此时FILE被赋值为[1.txt
2.txt], 是一个列表

最后docopt的返回结果是一个字典,返回的内容如下:

当对应的参数不存在的时候,对应的值会被置为False,
比如--control和--file_name。而--version则被置为True

python3
func_test1.py -v 1.txt

{'--control':
False,

'--file_name':
False,

'--version':
True,

'<pa>':
None,

'<content>':
'1.txt',

'FILE':
[],

'para':
False

同样的para置为True,pa被置为abc

python3
func_test1.py para abc

{'--control':
False,

'--file_name':
False,

'--version':
False,

'<pa>':
'abc',

'<content>':
None,

'FILE':
[],

'para':
True}

--file_name被置为True,FILE被置为[1.txt
2.txt]

python3
func_test1.py -f 1.txt 2.txt

{'--control':
False,

'--file_name':
True,

'--version':
False,

'<pa>':
None,

'<content>':
None,

'FILE':
['1.txt', '2.txt'],

'para':
False}

总结一下docopt的用法:

Usage中用到的一些标识的含义,正确地使用他们能够更好的完成解析任务:

[]

代表可选的元素,方括号内的元素可有可无

()

代表必须要有的元素,括号内的元素必须要有,哪怕是多个里面选一个。

|

互斥的元素,竖线两旁的元素只能有一个留下

代表元素可以重复出现,最后解析的结果是一个列表

[options]

指定特定的选项,完成特定的任务

另外格式方面Usage:和Options:必须要用一个空行隔开

像下面的这种格式会导致解析错误

"""

Usage:

func_test1.py
para <pa>

func_test1.py
[-vc] <content>

func_test1.py
[-f] [FILE] ...

Options:

-h
--help

-v
--version

-c
--control

-f
--file_name

"""

正确的格式:

"""

Usage:

func_test1.py
para <pa>

func_test1.py
[-vc] <content>

func_test1.py
[-f] [FILE] ...

Options:

-h
--help

-v
--version

-c
--control

-f
--file_name

"""

下面就是主体代码:

class
Requirements(object):

def
__init__(self, reqfile=None):

super(Requirements,
self).__init__()

self.path =
reqfile

self.requirements
= []

if reqfile:

self.load(reqfile)

def
__repr__(self):

return
'<Requirements \'{}\'>'.format(self.path)

def
load(self, reqfile):

if not
os.path.exists(reqfile):

raise
ValueError('The given requirements file does not exist.')

finder =
PackageFinder([], [], session=requests)

for
requirement in parse_requirements(reqfile, finder=finder,
session=requests):

if
requirement.req:

if not
getattr(requirement.req, 'name', None):

#
Prior to pip 8.1.2 the attribute `name` did not exist.

requirement.req.name
= requirement.req.project_name

self.requirements.append(requirement.req)

def
grep(reqfile, packages, silent=False):

try:

r =
Requirements(reqfile)

except
ValueError:

if not silent:

print('There
was a problem loading the given requirement file.')

exit(os.EX_NOINPUT)

for
req in r.requirements:

if req.name in
packages:

if not
silent:

print('Package
{} found!'.format(req.name))

exit(0)

if
not silent:

print('Not
found.')

exit(1)

def
main():

args
= docopt(__doc__, version='pip-grep')

kwargs =
{'reqfile': args['<reqfile>'], 'packages': args['<package>'],
'silent': args['-s']}

grep(**kwargs)

args保存的是输入的参数,reqfile就是Requirement.txt,package就是需要查询的模块名称。

1
Requirements中将所有在Requirement.txt中的模块保存在
self.requirements列表中

2
然后在grep中查找对应的模块名。

pip-grep的更多相关文章

  1. Python从2.6升级到2.7,使用pip安装module,报错:No Module named pip.log(转载)

    From:http://blog.csdn.net/iefreer/article/details/8086834 python升级后,使用pip安装module,错误: 错误原因:版本升级后,之前的 ...

  2. pip常用命令

    以flask为例. 1. 安装 # pip install flask 安装 flask. # pip install flask==1.0 安装 1.0版本的flask # pip install ...

  3. win10下Python3.6安装、配置以及pip安装包教程

    0.目录 1.前言 2.安装python 3.使用pip下载.安装包 3.1 安装Scrapy 3.2 安装PyQt 3.3 同时安装多个包 3.4 pip的常用命令 1.前言 之前在电脑上安装了py ...

  4. python3.6 pip 出现locations that require TLS/SSL异常解决方案

    在给CentOS服务器安装完Python3.6后,使用pip命令出现问题,提示说无法找到ssl模块. 上网查询后发现在安装Python3.6时没有安装openssl-devel依赖库,解决方案如下: ...

  5. 【QT】qt python install pip

    https://pip.pypa.io/en/stable/installing/ http://www.runoob.com/w3cnote/python-pip-install-usage.htm ...

  6. centos6.5安装python2.7、pip、numpy、scipy

    1..安装Development Tools yum groupinstall -y 'development tools' 2.安装SSL.bz2.zlib来为Python的安装做好准备工作 yum ...

  7. python3.7.2 pip 出现locations that require TLS/SSL异常处理方法

    centos7安装python3.7.2后,运行 pip3 install tornado 会报错 [root@localhost ~]# pip3 install tornado pip is co ...

  8. 用pip批量更新所有包

    p.s在先,事实证明,把电脑里所有的python包一次性更新是吃力不讨好的工作,不过,这是另一回事,如果你一定要这么做,根据http://stackoverflow.com/questions/272 ...

  9. [OSX] 使用 MacPorts 安装 Python 和 pip 指南

    Mac OS 未预装任何在 Unix/Linux 中常见的命令行包管理工具,Mac OS 中的 App Store 和自身的软件升级功能可以下载更新许多比较好的应用,但这些应用多数是满足普通消费者需求 ...

  10. Python pip常用指令

    pip listpip list --outdatedpip list --outdated | grep Jinja2pip uninstall pycurlpip show pycurlpip i ...

随机推荐

  1. iOS uitableivewCell 下划线顶格

    - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath ...

  2. S1:适配器 Adapter

    将一个类的接口转换为用户期望的另外一个接口.适配器使得原本由于接口不兼容而不能一起工作的类可以一起工作   UML: 一.类适配器: class A { public function methodA ...

  3. redis有序集合的一个应用

    一.需求 记录用户uid和上次操作时间;并清除5分钟以前的数据.用redis的一个key实现.本打算用hash,但hash类型在过期5分钟以前的数据时颇为麻烦. 二.代码实现 class LastLo ...

  4. List装form

    List<MemberPrivilegeForm> formlist = new ArrayList<MemberPrivilegeForm>(); int status = ...

  5. STL学习笔记(数值算法)

    运用数值算法之前必须先加入头文件<numeric> 加工运算后产生结果 1.对序列进行某种运算 T accumulate(InputIterator beg,InputIterator e ...

  6. Eclipse.ini参数设置

    最近Eclipse不知道是由于项目过多还是其他原因导致Eclipse进程容易卡死,一卡死Workspace保存出错,项目就全都不见了,又得重新导入...鉴于此原因,自己也上网查询了相关资料,现整理如下 ...

  7. 炒美股史考特(Scottrade)开户准备及如何获取免费交易(最新2017版)

    最新美股史考特(Scottrade)开户及汇款攻略 (2017 年 6 月) 一   前言 二   开户流程 三    激活账户 四 转账汇款 五 小结 一 前言:为什么选择史考特(Scottrade ...

  8. windows下忘记mysql超级管理员rootpassword的解决的方法

    今天帮一个朋友找回了MYSQL的超级管理员ROOTpassword.開始输入命令的时候少打了个"点"害的折腾了几个小时.最终攻克了,写个教程,方便以后使用! 假设你是server是 ...

  9. Windows进程间通信--共享内存映射文件(FileMapping)--VS2012下发送和接收

    之前以为两个互不相关的程序a.exe b.exe通信就只能通过网络,人家说可以通过发消息,我还深以为不然,对此,我表示万分惭愧. 之前课本上说的进程间通信,有共享内存.管道等之类的,但没有自己操刀写过 ...

  10. Nginx日志配置与切割

    访问日志主要记录客户端访问Nginx的每一个请求,格式可以自定义.通过访问日志,你可以得到用户地域来源.跳转来源.使用终端.某个URL访问量等相关信息. Nginx中访问日志相关指令主要有两条,一条是 ...