在Linux上一键部署Python及应用程序打包
我在服务器端开发了一个相对较大的Python应用程序,涉及到数据库连接、文件提取、解析和命令行调用等功能。
但是,部署这个应用程序变得非常麻烦,因为我使用了很多第三方模块,这些模块不在标准的Python库里。我已经搞不清楚自己用了哪些模块了。尤其是不同的Linux操作系统使用的模块版本也不同,所以通过操作系统的包管理器来安装它们就不太合适了。
我想把所有东西打包在一起,包括我现在使用的Python版本(大多数操作系统仍然带有Python 2.5或2.6,而我使用的是2.7,并且用到了一些2.7特有的功能)。
更重要的是,我还得教客户如何部署这个应用,这样他们才能在其他服务器上测试。但是他们并不是Linux专家。我需要让这个过程简单一些,最好能通过一个脚本或者简单的复制粘贴来完成。
虽然Windows有Portable Python,但Linux却没有类似的东西。而且我之前从来没有使用过Python打包,因为我通常只在我自己托管的服务器上工作。
请告诉我有哪些可用的Python打包和部署选项,能够包含所有已安装的Python模块和Python本身。
4 个回答
我想把它们放在一个模块里,包括我现在使用的Python版本(大多数操作系统仍然带有Python 2.5和2.6,而我使用的是2.7,并且我需要一些2.7特有的功能)。
也许你需要的是VirtualEnv?
这个话题比较广泛,不过我可以给你一些建议。
对于你的Python项目和它的依赖库,可以看看virtualenv和pip。
Virtualenv可以为你的目标平台提供一个独立的Python环境,你可以在这个环境中安装你的项目。
Pip是一个用来安装软件包的工具,它会下载并安装你的软件包以及它所需要的其他依赖库。你可以使用pip freeze命令,这样可以快速查看你在开发环境中已经安装了哪些依赖库。
如果你想了解更多关于Python中软件包分发的内容,可以看看distribute这个项目。
对于系统中非Python的部分,包括安装Python本身,可以使用像Puppet这样的系统自动化工具,但这可能对你的需求来说有点过于复杂。如果你想要一步到位的安装,可能需要考虑为你的目标系统的包管理器构建一个软件包。
大多数Python包可以通过在你的部署目录中创建一个叫做lib
的文件夹,或者类似的目录,然后在Python中把它添加到sys.path
,或者在外部设置PYTHONPATH
来进行部署。接着,把包的目录(通常是在你解压缩后的目录里面)复制到这个新建的目录里。这样,你就可以把包和你的代码一起保存,比如放在一个Mercurial代码库里。
部署Python本身会稍微麻烦一些,但如果你能控制它的安装位置(比如/usr/local
或者/opt
),那么只需要执行./configure --prefix=...
、make
和sudo make install
这几步。之后,你可以通过在脚本开头加一行#!/usr/local/bin/python
来指定使用这个Python,只要你的脚本被标记为可执行的。
举个例子,如果你要部署的代码需要用到docutils
,你可以这样做:
cd projectDir
mkdir -p lib
tar xzvf ~/Downloads/docutils-0.8.tgz
mv docutils-0.8/docutils lib
rm -r docutils-0.8
然后在这个目录里的Python模块开头只需加上以下内容:
#!/usr/local/bin/python
import os
import sys
sys.path(os.path.join(os.path.dirname(sys.argv[0]), "lib"))
import docutils