我们有几个在Linux上运行的Python 2.6应用程序。其中一些是Pylons
Web应用程序,其他一些只是长时间运行的进程,我们使用从命令行运行nohup
。我们还在virtualenv
开发和生产中使用。
将这些应用程序部署到生产服务器的最佳方法是什么?
在开发中,我们只需将源树放入任何目录,设置一个virtualenv并运行-
足够容易。我们可以在生产中进行相同的操作,也许这确实是最实用的解决方案,但是svn update
在生产中运行感觉有点不对。我们也尝试过fab
,但是它永远不会第一次起作用。对于每个应用程序,其他地方都会出错。令我感到震惊的是,鉴于我们要实现的目标从根本上讲非常简单,因此整个过程
太难了 。这是我们从部署过程中想要的。
就是这样!它能有多难?
通过setuptools与virtualenv和pip的结合,Python代码的开发和部署变得更加容易。
我发现最棘手的部分是运行一个开发环境,该环境应尽可能紧密地反映已部署的设置,同时尊重Pythonic工具和习惯用法。但是事实证明,使用pip和setuptools非常容易实现这一点,它们一起使您可以将开发树“安装”到Python环境中,而无需移动文件。(实际上,setuptools本身可以完成所有操作,但是pip可以更好地充当前端处理依赖项。)
另一个关键问题是使用两个环境中已知的软件包设置一个干净的环境。在这方面,Python的virtualenv是天赐之物,它允许您使用自己选择的软件包来配置完全定制的Python环境,而无需root访问权限或OS软件包(rpm或dpkg),并且不受任何软件包和版本的限制恰好安装在您的发行版上。
最后,一个令人讨厌的错误负担是创建与PYTHON_PATH配合使用的命令行脚本的困难。setuptools也非常优雅地处理了这一问题。
(为简单起见,这是规定性的。请随时进行适当区分。)
在工作目录中,设置一个新的Python虚拟环境:
$ python <untarred_directory>/virtualenv.py venv
您将需要在此虚拟环境中完成大部分工作。使用此命令来这样做(.
是的快捷方式source
):
$ . venv/bin/activate
安装点子:
$ easy_install pip
为要创建的每个可安装软件包创建目录。
在每个目录中,您都需要一个setup.py,用于定义软件包的内容和结构。setuptools 文档是一个很好的入门资源。值得花时间吸收大量的时间。
一旦树结构准备就绪,您几乎就可以开始编码了。但是现在,相互依赖的程序包无法像在已部署环境中那样相互看到。这个问题可以通过setuptools提供的一个巧妙的小技巧来解决,该技巧可以利用pip。对于正在开发的每个程序包,运行以下命令(确保您位于项目的虚拟环境中,按照上面的步骤3):
$ pip install -e pkg1
该命令将安装pkg1
到您的虚拟环境中,并且不会复制任何文件。它仅向site- packages
指向软件包开发根目录的目录添加链接,并在该根目录中创建一个egg-info目录。您也可以不使用点子来执行此操作,如下所示:
$ cd pkg1
$ python setup.py develop
它通常会工作,但如果你有第三方依赖(这应该在setup.py上市,作为解释这里的setuptools的文档中),PIP就是找到他们更聪明。
需要注意的一个警告是,setuptools和pip都不擅长在自己的程序包中查找依赖项。如果目录B中的PkgB依赖于目录A中的PkgA,pip install -e B
则将失败,因为pip无法知道可以在目录A中找到PkgA;相反,它将尝试并失败从其在线存储库源下载PkgA。解决方法是简单地在每个软件包依赖之后安装它们。
在这一点上,您可以启动python,加载您的模块之一并开始玩弄它。您可以编辑代码,下次导入时将立即可用。
最后,如果要使用软件包创建命令行工具。不要用手书写。最终,您将陷入一团糟的PYTHON_PATH骇客,这些骇客永远无法正常运作。只需阅读setuptools文档中的自动脚本创建即可。这将使您免于很多痛苦。
准备好要执行操作的软件包时,可以使用setup.py创建部署软件包。这里有太多选择,但是以下几点可以帮助您入门:
$ cd pkg1
$ python setup.py --help
$ python setup.py --help-commands
由于问题的广泛性,此答案不一定是完整的。我没有处理长时间运行的服务器,Web框架或实际的部署过程本身(特别是使用pip install --index- url
来管理第三方和内部软件包和的私有存储库-e vcs+...
,这会将软件包从svn,git中拉出,hg或bzr)。但我希望我给了您足够的绳索来将它们绑在一起(只是不要将自己吊死:-)。
如果我已经提交过了,但又有了一些新修改希望加入提交,但又不想再创建一个提交,我应该怎么做? 我知道可以 但这样操作很繁琐. 亦或者 但这样得把之前打印过的评论再输入一遍很麻烦感觉. 我觉得肯定有一条指令一行就能把这事搞定?
在这里,同一个时钟周期内,a被赋值的语句和c被赋值的语句的执行的先后顺序未必确定对不对? 我希望无论如何都是c<=a先执行,这样的话应该怎么写代码呢?我知道写在一个begin块里用=就行但我想知道不同always块内的情况,,, 刚开始搞这玩意不太明白,恳请赐教.
Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。
有两张表,分别储存产品信息与检测信息 检测信息表procheck中pro_id关联到产品信息表pro中的id,每个产品对应有多个检测信息记录 我现在需要把某个公司(产品表中company_id)生产的所有产品的最新一次检测报告调出来? 但是得出的结果却是: 全部给我找了出来,而我真正需要的是箭头上的三条即可。 求SQL语句.....
对于一个练习,我尝试创建一个登录页面。这是我第一次使用php。我已经看过很多指南,也看过stackoverflow的很多问题。这就是我想到的。(我正在对数据库使用XAMPP) 文件夹php:login。php,会话。欢迎。php,连接。php 文件夹页面:登录。html DB名称:leftoveryouth 表名:客户端 Colums:id、名、姓、出生日期、街道、街道、城市、plz、用户名、电子