python 命令-新手向——用python编写命令行应用的简洁方式
我们有一些方法可以做出Python的命令行式app。我试过它们,不过它们大都有自己的痛点和烦恼。所以我到社区里去寻找一种更好的方法。
什么是CLI?
CLI 意味着命令行界面(command line interface)。它是一类用命令行/终端调用的app。作为开发人员,更是一个少用鼠标,多用键盘党,我一直使用CLI应用。当我需要一些为自己服务的定制软件时,CLI就能满足我的需求,而python是一门能够快速生产CLI应用的伟大语言。
文件系统结构pycli/
├── README.md
├── install.sh
├── pycli
├── __init__.py
├── __main__.py
├── classmodule.py
└── funcmodule.py
└── setup.py
正如你所见,该项目的根目录被我命名为pycli。该应用也将在setup.py中被设置为以名称pycli被调用。
CLI子目录
在该CLI根目录下只有一个子目录。它的名字和CLI应用同名,但是在更复杂的CLI应用中,你需要有多个包。每个子目录是每个包的容器。在我的简单案例中,只有单个包,也就是单个子目录。
__init__.py
这个文件(空文件)放在这里是告诉Python这个目录是一个包。它可以是空的,只是做个关于包的简单提示;也可以包含实际代码,在包自身初始化时会被运行。
__main__.py
这是重要部分,是我们CLI应用的入口,根目录下的setup.py中的安装配置会指示它。这里只是放些简单的代码在这里表明它起作用了。import sysfrom .classmodule import MyClassfrom .funcmodule import my_functiondef main(): # 以下内容中的参数解析方式并不好,这里只是为了简单# 最好使用argparse或者click模块做这方面的工具
print('in main')
args = sys.argv[1:]
print('count of args :: {}'.format(len(args))) for arg in args:
print('passed argument :: {}'.format(arg))
my_function('hello world')
my_object = MyClass('Thomas')
my_object.say_name()#以下无关于包安装,只是为了本文件的测试if __name__ == '__main__':
main()
上面所做的只是引入一些其它模块,分析被传入CLI的命令行参数,然后使用导入模块的成员(一个简单的函数和一个简单的类)。
classmodule.py
一个被导入__main__.py并被实例化的极简的类(也没啥用)。这里是为了说明如何从同一个包里的其它模块中引入一个类。class MyClass():
def __init__(self, name): self.name = name def say_name(self):
print('name is {}'.format(self.name))
funcmodule.py
classmodule.py展示如何为__main__.py定义一个可以导入的类,funcmodule.py则展示了如何定义一个简单的函数让__main__.py导入并调用。def my_function(text_to_display):
print('text from my_function :: {}'.format(text_to_display))
setup.py
现在让我们回到CLI源码的根目录。setup.py文件将所有东西联系在一起并告诉Python如何处理它们。from setuptools import setup
setup(
name = 'pycli',
version = '0.1.0',
packages = ['pycli'],
entry_points = { 'console_scripts': [ 'pycli = pycli.__main__:main'
]
})
第一眼看上去可能觉得很复杂。但是全部工作只是从setuptools库导入setup函数,并传入一些参数来调用它。其中大部分是不言自明的。packages参数是根目录下所有包的列表。
entry_points是重要部分。它用字符串表明当前应用该以什么名称被调用,以及被运行时真正调用的是什么。这里写的是pycli = pycli.__main__:main,也就是说,该应用被叫做pycli,当执行该应用时它会调用pycli包下的__main__模块的main函数。就是这样!
install.sh
安装你的Python CLI应用的最佳方式是使用pip(python3则是pip3)。在CLI源码的根目录下运行pip3 install . 将会使用setup.py作为"指令"安装这个应用,同样,使用pip3 uninstall pycli会卸载这个应用。
写在脚本中即是pip3 uninstall pycli -y # 标签-y意味着确认卸载pip3 install .
这样会安装到python Lib的site-packages中,或者更简洁的是pip3 install -e .
这样是在当前根目录下生成了egg-info文件,而在site-packages文件夹中生成一个egg-link链接,如下图
这样,就可以直接运行install.sh以现有的CLI源码来更新原来的CLI应用了。
总结
掌握了简单的流程,用python编写命令行程序是简洁高效的。使用结果如首图。
作者:treelake
链接:https://www.jianshu.com/p/82bb5b1ce0df
python 命令-新手向——用python编写命令行应用的简洁方式相关推荐
- python自学-新手如何自学python课程?
为了Python的自学党们,传智播客真的是拼了,今天给大家讲讲新手如何自学python课程? 传智播客不仅有"人工智能+Python学习路线图",还根据以往的经验,总结出学习Pyt ...
- python新手教材_开始Python的新手教程,python不再困难
Python是近年来最火爆的语言,已经作为数据分析和机器学习的首选语言之一. Python虽然被诟病不够快,但足够灵活和易上手.Python教程主要围绕数据分析展开,所以技术原理这类内容会略过,可以认 ...
- Python爬虫新手教程:Python分析了 7 万款 App,万万没想到
摘要:使用 Scrapy 爬取豌豆荚全网 70,000+ App,并进行探索性分析. 写在前面:若对数据抓取部分不感兴趣,可以直接下拉到数据分析部分. 1 分析背景 之前我们使用了 Scrapy 爬取 ...
- Python爬虫新手教程:Python分析了 7 万款 App,万万没想到!
摘要:使用 Scrapy 爬取豌豆荚全网 70,000+ App,并进行探索性分析. 写在前面:若对数据抓取部分不感兴趣,可以直接下拉到数据分析部分. 1 分析背景 之前我们使用了 Scrapy 爬取 ...
- python工具是什么-使用Python编写命令行工具有什么好的库?
使用Python编写命令行工具的库很多,我最推荐的还是Google Fire Hello World 要介绍Fire是什么,看一个简单的例子就明白了 # calc.py import fire cla ...
- python输入正方形边长值、计算其面积_尝试修改列6.2编写命令行参数解析的程序,解析命令行参数所输入边长的值,计算并输出正方形的周长和面积。_学小易找答案...
[简答题] [单选题]ZigBee 中每个协调点最多可连接______个节点,一个ZigBee网络最多可容纳______个节点.( ) [资料题]DWord-Ans.pdf 索引和目录.pdf 完成效 ...
- ubuntu中mysql怎么退出命令_如何使用Python进行MySQL数据库管理
本节我们将学习使用Python进行MySQL数据库管理.Python有多种用于MySQL数据库管理的模块,这里使用MySQLdb模块.MySQLdb模块是MySQL数据库服务器的接口,用于向Pytho ...
- python的setup.py文件及其常用命令
python的setup.py文件及其常用命令 上传者:tingting1718 我也要"分享赚钱" 2014/7/7 关注(286) 评论(0) 声明:此内容仅代表网友 ...
- python调用adb shell命令_Python之使用adb shell命令启动应用的方法详解
Python之使用adb shell命令启动应用的方法详解 一直有一个心愿希望可以用Python做安卓自动化功能测试,在一步步摸索中,之前是用monkeyrunner,但是发现对于控件ID的使用非常具 ...
最新文章
- Python 官网宣布,正式发布 Python 3.8.0!
- 指针的理解 -- java程序员学C语言日记二
- 哈夫曼编码(Huffman Coding)
- Java字符串的重要性_java中的字符串相关知识整理
- toast, 警告窗
- 完全卸载gitlab
- 基于统计语言模型的分词方法
- 微信小程序canvas 图片绘制
- 使用拉普拉斯算子锐化图像
- 杰·亚伯拉罕的产品营销35种策略完整版
- java jre安装_JRE安装与配置图文教程
- class CText{}; CText t; int const CText::*p; 什么意思?
- DTC Sprint总结——管理经验篇
- 关于二维数组传参问题
- 微信小程序保存图片到手机相册(封装全局使用)
- 北京市参加汽车摇号条件
- Hills And Valleys
- python双击py一闪_python双击py一闪 python编程
- 小程序里显示店铺地址,可在地图上查看,可点击导航到店铺
- 医学研究中危险因素探索的分析思路