pip-grep
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的更多相关文章
- Python从2.6升级到2.7,使用pip安装module,报错:No Module named pip.log(转载)
From:http://blog.csdn.net/iefreer/article/details/8086834 python升级后,使用pip安装module,错误: 错误原因:版本升级后,之前的 ...
- pip常用命令
以flask为例. 1. 安装 # pip install flask 安装 flask. # pip install flask==1.0 安装 1.0版本的flask # pip install ...
- win10下Python3.6安装、配置以及pip安装包教程
0.目录 1.前言 2.安装python 3.使用pip下载.安装包 3.1 安装Scrapy 3.2 安装PyQt 3.3 同时安装多个包 3.4 pip的常用命令 1.前言 之前在电脑上安装了py ...
- python3.6 pip 出现locations that require TLS/SSL异常解决方案
在给CentOS服务器安装完Python3.6后,使用pip命令出现问题,提示说无法找到ssl模块. 上网查询后发现在安装Python3.6时没有安装openssl-devel依赖库,解决方案如下: ...
- 【QT】qt python install pip
https://pip.pypa.io/en/stable/installing/ http://www.runoob.com/w3cnote/python-pip-install-usage.htm ...
- centos6.5安装python2.7、pip、numpy、scipy
1..安装Development Tools yum groupinstall -y 'development tools' 2.安装SSL.bz2.zlib来为Python的安装做好准备工作 yum ...
- python3.7.2 pip 出现locations that require TLS/SSL异常处理方法
centos7安装python3.7.2后,运行 pip3 install tornado 会报错 [root@localhost ~]# pip3 install tornado pip is co ...
- 用pip批量更新所有包
p.s在先,事实证明,把电脑里所有的python包一次性更新是吃力不讨好的工作,不过,这是另一回事,如果你一定要这么做,根据http://stackoverflow.com/questions/272 ...
- [OSX] 使用 MacPorts 安装 Python 和 pip 指南
Mac OS 未预装任何在 Unix/Linux 中常见的命令行包管理工具,Mac OS 中的 App Store 和自身的软件升级功能可以下载更新许多比较好的应用,但这些应用多数是满足普通消费者需求 ...
- Python pip常用指令
pip listpip list --outdatedpip list --outdated | grep Jinja2pip uninstall pycurlpip show pycurlpip i ...
随机推荐
- Angular 学习笔记——$rounte
<!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...
- 内容提供器(ContentProvider)
一.简介内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性.目前,使 ...
- Windows重装系统
本文主要针对那些不会重装系统windows的用户,虽然重装系统win7或win10很简单,但是还是有一些小白不明白如何安装新系统,也不清楚有几种安装方式.本教程现在就详细的讲讲利用U盘重装系统的具体步 ...
- 安装IntelliJ IDEA默认C盘文件过大怎么办
方法如下: 找到安装路径下有个属性文件,我的是在 D:\Program Files\JetBrains\IntelliJ IDEA 2017.3.2\bin 进入bin目录后找到属性文件:idea.p ...
- java在linux上始终无法用jdbc跟myql连接
确实手动在机器上连接mysql没问题的话,尝试下面的方法 a.重启网卡 b.重启系统
- wps如何设置文字环绕图片
wps在编辑一些文字的时候,经常会插入一些图片,但是插入图片后,文字和图片就被分离开来,整体显得没有那么美观整洁,这个时候就用到了软件的文字环绕功能,那么具体如何设置呢,接下来看教程. 首先打开wps ...
- C#中的里氏替换原则
里氏转换原则 子类可以赋值给父类对象 父类对象可以强制转化为对应的子类对象 里氏替换原则直观理解就是"子类是父类",反过来就说不通了. 就像男人是人对的,但人是男人就不对了. 这样 ...
- Snail—UI学习之UITextField
简单看一下UITextField的属性 - (void)createTextField{ UITextField * textField = [[UITextField alloc] initWith ...
- 匿名函数块级作用域以及在JQuery中的应用
最近经常回在群里面看到有些朋友问如下这样的js写法该如何理解的的问题,虽然可能对匿名函数有些理解,但是有时候看到JQuery源码或者其他JS库中同样的写法时,就有点不理解了,今天再次分享下这方面的知识 ...
- [译]GLUT教程 - 整合代码2
Lighthouse3d.com >> GLUT Tutorial >> Input >> The Code So Far II 以下是前面几节的完整整合代码: # ...