在Linux上一键部署Python及应用程序打包

4 投票
4 回答
7382 浏览
提问于 2025-04-16 21:35

我在服务器端开发了一个相对较大的Python应用程序,涉及到数据库连接、文件提取、解析和命令行调用等功能。

但是,部署这个应用程序变得非常麻烦,因为我使用了很多第三方模块,这些模块不在标准的Python库里。我已经搞不清楚自己用了哪些模块了。尤其是不同的Linux操作系统使用的模块版本也不同,所以通过操作系统的包管理器来安装它们就不太合适了。

我想把所有东西打包在一起,包括我现在使用的Python版本(大多数操作系统仍然带有Python 2.5或2.6,而我使用的是2.7,并且用到了一些2.7特有的功能)。

更重要的是,我还得教客户如何部署这个应用,这样他们才能在其他服务器上测试。但是他们并不是Linux专家。我需要让这个过程简单一些,最好能通过一个脚本或者简单的复制粘贴来完成。

虽然Windows有Portable Python,但Linux却没有类似的东西。而且我之前从来没有使用过Python打包,因为我通常只在我自己托管的服务器上工作。

请告诉我有哪些可用的Python打包和部署选项,能够包含所有已安装的Python模块和Python本身。

4 个回答

0

我想把它们放在一个模块里,包括我现在使用的Python版本(大多数操作系统仍然带有Python 2.5和2.6,而我使用的是2.7,并且我需要一些2.7特有的功能)。

也许你需要的是VirtualEnv?

1

这个话题比较广泛,不过我可以给你一些建议。

对于你的Python项目和它的依赖库,可以看看virtualenvpip

Virtualenv可以为你的目标平台提供一个独立的Python环境,你可以在这个环境中安装你的项目。

Pip是一个用来安装软件包的工具,它会下载并安装你的软件包以及它所需要的其他依赖库。你可以使用pip freeze命令,这样可以快速查看你在开发环境中已经安装了哪些依赖库。

如果你想了解更多关于Python中软件包分发的内容,可以看看distribute这个项目。

对于系统中非Python的部分,包括安装Python本身,可以使用像Puppet这样的系统自动化工具,但这可能对你的需求来说有点过于复杂。如果你想要一步到位的安装,可能需要考虑为你的目标系统的包管理器构建一个软件包。

5

大多数Python包可以通过在你的部署目录中创建一个叫做lib的文件夹,或者类似的目录,然后在Python中把它添加到sys.path,或者在外部设置PYTHONPATH来进行部署。接着,把包的目录(通常是在你解压缩后的目录里面)复制到这个新建的目录里。这样,你就可以把包和你的代码一起保存,比如放在一个Mercurial代码库里。

部署Python本身会稍微麻烦一些,但如果你能控制它的安装位置(比如/usr/local或者/opt),那么只需要执行./configure --prefix=...makesudo 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

撰写回答