打包 Python 应用程序及其依赖项
网络代理 » 数字新闻 » 打包 Python 应用程序及其依赖项

打包 Python 应用程序及其依赖项

前段时间我用 Python 开发了一个应用程序。 要设置上下文,它涉及创建一个能够部署的可执行文件 泊坞窗,compose.yml 通过应用业务规则。 为了不重写一切,我创建了一个项目 蟒蛇 能够使用图书馆 泊坞窗,撰写 这也是在 Python 中。 一旦功能正常,我的应用程序必须构建在一个文件中。 我的目标是 生成一个包含所有依赖项的二进制文件 (有点像 Golang)。

注意力 ! 生成二进制文件并不能免除您在计算机上安装 Python 的责任。 二进制文件不是已编译的应用程序,而只是一个包。

建筑

首先,您将创建一个文件夹 foob​​ar 在你的项目中。 这将包含您的所有工作。

1
2
3
4
5
6
项目
|_ __main__.py
|_ foobar
|_ __init__.py
|_ __main__.py
|_cli.py

如果你看过这篇文章,这意味着你至少和我一样了解 Python,因此知道如何全局或在一个环境中安装依赖项。 的virtualenv.

就个人而言,我在一个 Docker-容器 所以我将我的依赖项安装为全局变量。

这是安装依赖项的方法。

1
$ pip 安装 docopt

然后你可以处理你的文件 剪辑.py. 这是使用库的示例 医生.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 项目/foobar/cli.py
医生 进口 医生
释放= “ 1.0.0”
帮助= « » »福巴
用法:
foob​​ar版本
选项:
-h --help 显示帮助
Foobar 是由 Baptiste Donaux 开发的一个伪造的开源项目。
“”“
DEF ():
参数 = 文档(帮助)
if 参数[“ 版本 ”]:
打印(“foobar 版”, 版本)

需要一个文件来启动正在开发的应用程序(在我的例子中 __init__.py 是一个空但必需的文件)。

1
2
3
4
5
6
# 项目/foobar/__main__.py
. 进口 CLI
if __名字__ == “ __手__ ”:
cli.main()

要构建二进制包,您需要一个入口点 (项目/__main__.py).

1
2
3
4
5
6
# 项目/__main__.py
foob​​ar 进口 CLI
if __名字__ == “ __手__ ”:
cli.main()

现在您可以轻松地运行您的应用程序。

1
2
$ python ./foobar/ 版本
('foobar版本', “1.0.0”)

构建静态二进制文件

工作流程

从一个干净的项目(没有依赖......),这里是将要执行的步骤。

  • 创建一个 的virtualenv 并激活它
  • 安装依赖并退出 的virtualenv
  • 删除存在于目录中的文件和文件夹 的virtualenv/lib/python2.7/sites-packages对应一个文件夹 点子,缓存文件夹,用于编译文件或信息文件。
  • 创建一个文件夹来构建最终文件
  • 将依赖项、源和输入文件复制到新创建的文件夹中。
  • 创建一个压缩文件夹(邮编) 构建文件夹的内容。
  • 创建带有标头的“二进制”文件以指定环境并将压缩文件夹的内容附加到此文件。

性交

以下是要遵循的技术步骤。

1
2
3
4
5
6
7
8
9
10
11
12
$ 虚拟环境依赖
$。 ./dependencies/bin/activate
$ pip 安装 docopt
$停用
$ rm -rf $(找到 ./dependencies/lib/python2.7/site-packages -print | egrep '(/pip/)|(__pycache__)|(.(pyc|dist-info|so)$)')
$ mkdir 构建
$ cp -R ./dependencies/lib/python2.7/site-packages/* ./foobar ./__main__.py ./build/
$ cd 。/建造
$ zip -r ../release.zip *
$ 回音 '#!/usr/bin/env python' > ../发布
$ cat ../release.zip >> ../release
$ chmod +x ../发布

总结

现在您可以轻松运行您的二进制文件。 它嵌入了所有上下文。

1
2
$ ./发布版本
('foobar版本', “1.0.0”)

这个解决方案对我部署单个文件的应用程序非常方便。 您可以下载示例文件存档以重现我的演示。

★★★★★