- Preface 前言
- 第1章 引论
- 第2章 编程惯用法
- 第3章 基础语法
- 建议19:有节制地使用 from…import 语句
- 建议20:优先使用 absolute import 来导入模块
- 建议21:i+=1 不等于 ++i
- 建议22:使用 with 自动关闭资源
- 建议23:使用 else 子句简化循环(异常处理)
- 建议24:遵循异常处理的几点基本原则
- 建议25:避免 finally 中可能发生的陷阱
- 建议26:深入理解 None 正确判断对象是否为空
- 建议27:连接字符串应优先使用 join 而不是 +
- 建议28:格式化字符串时尽量使用 .format 方式而不是 %
- 建议29:区别对待可变对象和不可变对象
- 建议30:[]、() 和 {}:一致的容器初始化形式
- 建议31:记住函数传参既不是传值也不是传引用
- 建议32:警惕默认参数潜在的问题
- 建议33:慎用变长参数
- 建议34:深入理解 str() 和 repr() 的区别
- 建议35:分清 staticmethod 和 classmethod 的适用场景
- 第4章 库
- 建议36:掌握字符串的基本用法
- 建议37:按需选择 sort() 或者 sorted()
- 建议38:使用 copy 模块深拷贝对象
- 建议39:使用 Counter 进行计数统计
- 建议40:深入掌握 ConfigParser
- 建议41:使用 argparse 处理命令行参数
- 建议42:使用 pandas 处理大型 CSV 文件
- 建议43:一般情况使用 ElementTree 解析 XML
- 建议44:理解模块 pickle 优劣
- 建议45:序列化的另一个不错的选择 JSON
- 建议46:使用 traceback 获取栈信息
- 建议47:使用 logging 记录日志信息
- 建议48:使用 threading 模块编写多线程程序
- 建议49:使用 Queue 使多线程编程更安全
- 第5章 设计模式
- 第6章 内部机制
- 建议54:理解 built-in objects
- 建议55:init() 不是构造方法
- 建议56:理解名字查找机制
- 建议57:为什么需要 self 参数
- 建议58:理解 MRO 与多继承
- 建议59:理解描述符机制
- 建议60:区别 getattr() 和 getattribute() 方法
- 建议61:使用更为安全的 property
- 建议62:掌握 metaclass
- 建议63:熟悉 Python 对象协议
- 建议64:利用操作符重载实现中缀语法
- 建议65:熟悉 Python 的迭代器协议
- 建议66:熟悉 Python 的生成器
- 建议67:基于生成器的协程及 greenlet
- 建议68:理解 GIL 的局限性
- 建议69:对象的管理与垃圾回收
- 第7章 使用工具辅助项目开发
- 第8章 性能剖析与优化
建议78:将包发布到 PyPI
建立项目之后,添加了相应的业务代码,并通过测试之后,就可以考虑发布给下游用户了。如果是项目内部协作,把项目打一个zip包或者tar ball发出去,最简单不过了。不过尽管如此简单,setuptools仍然提供了完善的支持。
>sudo python setup.py sdist --formats=zip,gztar running sdist running check creating arithmetic-1.0 making hard links in arithmetic-1.0... hard linking arithmetic.py -> arithmetic-1.0 hard linking setup.py -> arithmetic-1.0 creating dist creating 'dist/arithmetic-1.0.zip' and adding 'arithmetic-1.0' to it adding 'arithmetic-1.0/arithmetic.py' adding 'arithmetic-1.0/PKG-INFO' adding 'arithmetic-1.0/setup.py' Creating tar archive removing 'arithmetic-1.0' (and everything under it)
setuptools的sdist命令的意思是构建一个源代码发行包,它将根据调用setup()函数时给定的实参将整个项目打包(和压缩)。根据当前的平台(操作系统)不同,产出的文件也是不一样的。一般在MS Windows系统下,产生.zip格式的压缩包,而在GNU Linux或Mac OS X系统下,产生.tar.gz格式的压缩包。考虑到最终安装程序包的用户可能在不同的系统下使用,需要产品指定(或更多)格式的包文件,可以使用--formats参数。如上列指定产生.zip格式和.tar.gz格式。最终产生的包文件放在./dist目录下。
>ls dist arithmetic-1.0.tar.gz arithmetic-1.0.zip
产生这两个包以后,就可以发布给项目的下游合作者了。发布方式可以是邮件、FTP,或者直接使用IM传送。下游开发者收到后有两种安装方式:一种是解压缩,然后进入setup.py文件所在的目录执行python setup.py install命令安装;另一种是使用pip安装,执行pip install arithmetic-1.0.tar.gz即可。
对于个人项目或者迷你团队而言,通过邮件、FTP或者IM发布无可厚非,但如果是较大的团队一起协作一个项目,那么最好是把包发布到PyPI上面。可以是pypi.python.org这个官方的PyPI,也可以是团队架设的私有PyPI。在这里,先讲一下怎么把包发布到官方的PyPI。
其实标准库distutils自身已经带有发布到PyPI的功能,那就是register和upload命令。
$ python setup.py --help-commands Standard commands: ... register register the distribution with the Python package index ... upload upload binary package to PyPI ...
register命令用以在PyPI上面注册一个包,这个包名必须是尚未使用过的。在注册包名之前,先在PyPI上注册一个用户,可以通过PyPI网页注册,也可以直接使用register命令提供的选项注册。
$ python setup.py register ... We need to know who you are, so please choose either: 1. use your existing login, 2. register as a new user, 3. have the server generate a new password for you (and email it to you), or 4. quit Your selection [default 1]:
上面第2个选项就是用来注册新用户的,选中之后向导将会指引用户输入用户名、密码和邮箱等信息,很快就可以注册完成,在此不展开说了。如果已经有了PyPI账号,那么选择第1个选项,输入用户名和密码,验证通过以后,distutils向PyPI申请注册包名,一般都能够成功。但如果这个包名已经被别的用户使用过了,那会引发一个403错误,指出你不能把这个包的信息存储到PyPI。
$ python setup.py register -n running register running check ... Registering arithmetic to http://pypi.python.org/pypi Server response (200): OK
包名注册之后,就可以把包上传到PyPI了。
$ python setup.py sdist upload running sdist running check writing manifest file 'MANIFEST' creating arithmetic-1.0 making hard links in arithmetic-1.0... hard linking arithmetic.py -> arithmetic-1.0 hard linking setup.py -> arithmetic-1.0 Creating tar archive removing 'arithmetic-1.0' (and everything under it) running upload Submitting dist/arithmetic-1.0.tar.gz to http://pypi.python.org/pypi Server response (200): OK
上传之后,就可以通知合作者使用setuptools/pip安装了。
pip install arithmetic
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论