稀有猿诉

十年磨一剑,历炼出锋芒,说话千百句,不如码二行。

Deploying Python Applications

一个软件项目通常的开发流程包括创建,开发,打包和发布,不同为类型的项目具体过程可能不太一样,比如像Web项目,最后一般不叫发布而是叫做部署,并且像动态语言类的项目一般不会有打包过程。但总的来说,这几个流程确实是任何一个软件开发过程中必做的事情。今天就来学习一下如何部署Python应用程序,也就是除了项目开发写代码以外的一些必须做的事情。

注意:本文不去纠结项目和应用程序的具体定义与区别,就是泛指一个软件项目,一坨脚本工具集,一个module package,一个桌面应用程序,一个Web app都是一个项目。并且项目和应用程序也基本上指的是同一个东西,很多语境下可互换。

以符合规范的方式来开发项目

在讨论部署之前,我们先谈谈项目的创建与开发,视项目的不同用途,每个类型的项目都会有相应的开发规范,比如要创建哪些必备的配置类的文件,比如要采用什么样的目录结构。并没有一个大一统的统一规范,但是不同的类型的项目确实会有其规范,比如一个package要如何创建,一个Django app要如何创建。

我们还是要符合具体项目类型的要求,这样的做的原因是,当开发完成后,进行打包和部署的时候会容易得多。

可以参考 《Expert Python Programming 2nd Edition》中的第五章『Creating a package』。

打包和部署

Python是通用的编程语言,在打包和部署这块也是相当灵活的,没有固定和统一的规则,主要还是依据不同类型的项目来确实具体的部署策略。

package

package是指一坨Python代码的集合,是可以供其他人使用的库,应该被视为三方module。Python是有完整的生态的,它提供三方module的聚合PyPI,提供下载管理工具pip, 以及module(package是更正式的称谓)的开发和发布机制。

Desktop app

这里的Desktop app是指除了package(会发布到PyPI的)和Web app以外的,能独立运行的,没有与客户端或者其他服务器有太多交互的通用应用程序,比如一些脚本,或者一个桌面应用程序都算Desktop app。

其实,这里重点想强调的就是运行环境,可以是本机,也可以是服务器。

Web app

Web app一般部署规则都由其使用的框架决定,比如Django有其自己的规则和方法,而Flask又有一套。也跟服务器有关系,比如部署到私有服务器,跟部署到云服务上面是完全不一样的。

部署到服务器

这个跟Web app不太一样,Web app当然要部署到服务器中。但需要往服务器部署的可不止Web app,一些工具性脚本,Desktop app也有可能需要往服务器部署,这只是有别于本机运行的不同的环境而已,与app的类型并没有太多关系。

使用虚拟环境

简单的项目还好,如果复杂一点的项目,最好使用虚拟环境进行隔离,我们在另外一个文章里面有详细的讨论。

如果项目真的是比较复杂,并且用了超出Python的东西,或者说需要往服务器部署,那么最好的方式是使用Docker。

更多内容可以参考 《Expert Python Programming 2nd Edition》中的第六章『Chapter 6. Deploying Code』。

参考资料

Comments