我们有一些方法可以做出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编写命令行应用的简洁方式相关推荐

  1. python自学-新手如何自学python课程?

    为了Python的自学党们,传智播客真的是拼了,今天给大家讲讲新手如何自学python课程? 传智播客不仅有"人工智能+Python学习路线图",还根据以往的经验,总结出学习Pyt ...

  2. python新手教材_开始Python的新手教程,python不再困难

    Python是近年来最火爆的语言,已经作为数据分析和机器学习的首选语言之一. Python虽然被诟病不够快,但足够灵活和易上手.Python教程主要围绕数据分析展开,所以技术原理这类内容会略过,可以认 ...

  3. Python爬虫新手教程:Python分析了 7 万款 App,万万没想到

    摘要:使用 Scrapy 爬取豌豆荚全网 70,000+ App,并进行探索性分析. 写在前面:若对数据抓取部分不感兴趣,可以直接下拉到数据分析部分. 1 分析背景 之前我们使用了 Scrapy 爬取 ...

  4. Python爬虫新手教程:Python分析了 7 万款 App,万万没想到!

    摘要:使用 Scrapy 爬取豌豆荚全网 70,000+ App,并进行探索性分析. 写在前面:若对数据抓取部分不感兴趣,可以直接下拉到数据分析部分. 1 分析背景 之前我们使用了 Scrapy 爬取 ...

  5. python工具是什么-使用Python编写命令行工具有什么好的库?

    使用Python编写命令行工具的库很多,我最推荐的还是Google Fire Hello World 要介绍Fire是什么,看一个简单的例子就明白了 # calc.py import fire cla ...

  6. python输入正方形边长值、计算其面积_尝试修改列6.2编写命令行参数解析的程序,解析命令行参数所输入边长的值,计算并输出正方形的周长和面积。_学小易找答案...

    [简答题] [单选题]ZigBee 中每个协调点最多可连接______个节点,一个ZigBee网络最多可容纳______个节点.( ) [资料题]DWord-Ans.pdf 索引和目录.pdf 完成效 ...

  7. ubuntu中mysql怎么退出命令_如何使用Python进行MySQL数据库管理

    本节我们将学习使用Python进行MySQL数据库管理.Python有多种用于MySQL数据库管理的模块,这里使用MySQLdb模块.MySQLdb模块是MySQL数据库服务器的接口,用于向Pytho ...

  8. python的setup.py文件及其常用命令

    python的setup.py文件及其常用命令 上传者:tingting1718      我也要"分享赚钱" 2014/7/7 关注(286) 评论(0) 声明:此内容仅代表网友 ...

  9. python调用adb shell命令_Python之使用adb shell命令启动应用的方法详解

    Python之使用adb shell命令启动应用的方法详解 一直有一个心愿希望可以用Python做安卓自动化功能测试,在一步步摸索中,之前是用monkeyrunner,但是发现对于控件ID的使用非常具 ...

最新文章

  1. Python 官网宣布,正式发布 Python 3.8.0!
  2. 指针的理解 -- java程序员学C语言日记二
  3. 哈夫曼编码(Huffman Coding)
  4. Java字符串的重要性_java中的字符串相关知识整理
  5. toast, 警告窗
  6. 完全卸载gitlab
  7. 基于统计语言模型的分词方法
  8. 微信小程序canvas 图片绘制
  9. 使用拉普拉斯算子锐化图像
  10. 杰·亚伯拉罕的产品营销35种策略完整版
  11. java jre安装_JRE安装与配置图文教程
  12. class CText{}; CText t; int const CText::*p; 什么意思?
  13. DTC Sprint总结——管理经验篇
  14. 关于二维数组传参问题
  15. 微信小程序保存图片到手机相册(封装全局使用)
  16. 北京市参加汽车摇号条件
  17. Hills And Valleys
  18. python双击py一闪_python双击py一闪 python编程
  19. 小程序里显示店铺地址,可在地图上查看,可点击导航到店铺
  20. 医学研究中危险因素探索的分析思路

热门文章

  1. typescript 入门例子 Hello world——ts就是一个宿主机语言
  2. aliyun 日志服务(Log Service,Log)是针对日志场景的一站式服务
  3. 2019.7.15随笔
  4. 网络请求之get post
  5. php回调函数原理和实例
  6. 没有一种成功是不经历磨砺的
  7. sscanf用法简介
  8. 人人都应该知道的身体小窍门!
  9. 去掉动网广告“国内使用量最大的动网论坛”的方法
  10. ML-kNN 多标签k近邻算法 MLL Week 1