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. Java.lang.NoClassDefFoundError--找不到相应的类

    如题Java.lang.NoClassDefFoundError 错误可能是由于找不到指定的类引起的. 一般出现在java 反射调用,或者通过jniRegisterNativeMethods手动注册j ...

  2. Sending SMS And Dialing Numbers without User Consent(Context is not needed)

    Sending SMS And Dialing Numbers without User Consent Sending SMS does not require context or user in ...

  3. Windows无法删除文件 提示找不到该项目怎么办

    1 如图所示,我想要删除某个文件,提示如图所示,一般用360的强力删除也不管用.   2 在桌面新建一个文本文档,并输入以下内容.保存为bat格式(比如Delete.bat).然后把这个删不掉的文件拖 ...

  4. 【Excle数据透视表】如何利用图标集将销售数据划分为五个等级

    我们如何用图标集来直观看出订单情况呢? 现在有数据如下: 步骤 选中"订单列"→开始→条件格式→图标集→等级→ 此时,在每个数字前面都出现了一个等级符号了 查看预置五等级图标集的规 ...

  5. 转载(Asp.net Core 中试使用ZKWeb.System.Drawing)

    完美 原文Link: https://www.yanning.wang/archives/644.html 记录下做备份. 很少用Linux服务器. 这下可给整的够呛, 特别是按照官网竟然还不行, 所 ...

  6. 互联网我来了 -- 2. js中&quot;异步/堵塞&quot;等概念的简析

    一.什么是"异步非堵塞式"? 这个名字听起来非常恶心难懂,但假设以 买内裤 这件事情来比喻运行程序的话就非常easy理解"异步非堵塞式"的涵义了. 比如你是一个 ...

  7. kernel feature collection

    Fault injection http://lwn.net/Articles/209257/ The framework can cause memory allocation failures a ...

  8. CentOs yum源安装 nginx

    1 更新源 [root@server ~]#rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.no ...

  9. ISE封装IP

    1.综合成ngc文件,然后再黑盒调用,再写一个端口文件(写个空壳文件,就是定义输入输出,在工程里面调用这个文件就行,把ngc放到工程目录下).

  10. 【一键激活win8.1系统】

    下载激活工具地址: 链接:https://pan.baidu.com/s/1AUaQQRcqfCYWK94KapYjjA 密码:i4sk 下载后,右键单击“以管理员身份运行”Microsoft Too ...