python - 以专业的方式打包和发送 python 库和脚本

标签 python

我的任务是打包和运送商业应用程序包,其中包括:

  1. 一个python库(由我们开发)
  2. 一些依赖于上述库的 python 程序
  3. 其他库不是我们开发的,但它们是我们库的依赖项。
  4. 一个完整的python安装(python 2.6)
  5. 其他语言的其他内容、库和程序。这里不用担心,因为它们没有连接到上述机器中,并且当前的运输过程已经有效。

该 bundle 已发布到 Linux、OSX 和 Windows。在 Linux 上,它以简单的 tar.gz 形式分发。用户只需在 .bashrc 中解压 tar.gz 和 source 提供的 bash 脚本,以便正确设置环境。在mac上,它是一个dmg。在windows上,我不知道。 windows 的家伙今天不在,但我看到的是一个 exe 以某种方式创建。

我现在将更详细地解释以上几点。

我们的 Python 库

我们不想提供源代码,所以我们只想提供编译后的 python 文件。欢迎使用更好的策略来使它们更加防篡改,即使它涉及一些深度黑客攻击(例如,我曾经看到魔术从一个“损坏”的临时文件中导入东西)。目前该库没有 C 级代码或类似的平台相关代码,但这很快就会改变。因此,我们必须提供特定平台编译的 .so 以及 pyc。

很明显,这个库将与我们的应用程序的其余部分一起提供。因此,它将安装在下载的 bundle 中。出于这个原因,它必须是完全可重定位的,并且用户必须以某种方式(手动或通过我们的 env 脚本)将解压缩包的位置添加到 PYTHONPATH,以便解释器可以找到它。

我们的 Python 程序

我们将在 bundle 中发布应用程序,这些应用程序将依赖于我们的库。这些应用程序的代码必须要么对用户可见(以便他可以学习如何使用库接口(interface)),要么不可见(对于那些我们希望保持封闭源代码的实用程序),因此需要双重方法。

其他库

我们的库依赖于我们必须发布的第 3 方库,以便用户启动并运行而无需任何依赖搜索。显然,这些库将由我们在 bundle 中安装,但我们必须希望它们不会在构建过程中将安装路径存储在某处,因为这会使它们不可重定位。

我们的 python

我们将发布我们的 python 版本,我们假设用户将运行它以访问我们的脚本。这是因为我们要确保 python 版本正在运行。此外,我们可能会修改一些可执行文件或标准库。我们可能担心此 python 与标准 python 的交互,如果用户想要在我们的 python 上使用特定库,则必须将其安装在我们的 bundle 中,而不是库的标准位置。

请求

我需要认真考虑这项任务。我已经看到它完成了,但从未亲自做过,所以我需要你的观点。我上面介绍的是我认为事情应该如何运作,根据现在的运作方式,但它可能是错误的。欢迎任何成功部署的提示、怪癖、建议或策略。鉴于问题的复杂性,我已经根据我能得到的最佳答案宣布了高额赏金。

最佳答案

这不是一个完整的答案,而只是一堆想法。我为客户编写了一个安装程序,其中包含了一些可能对您有用的想法。

它只是 Linux,所以我只专注于它。我们需要发布特定的自定义版本的 mySQL、lighttpd、python、memcached、一些第 3 方 Python 模块和一些自定义脚本。我们需要毫无问题地启动所有这些服务,并让用户使用常规的初始化脚本来控制它们。它应该在一堆流行的发行版上运行良好,因此不应该依赖发行版特定的东西。

我所做的如下。

  1. 创建了一个 500MB(我不记得大小)的文件并将其格式化为 ext3fs 文件系统。
  2. 使用环回设备将其安装在某个点。
  3. 在挂载点上运行 deb-bootstrap 以创建自定义 Debian 安装。
  4. 在分区内 Chroot,然后运行一堆脚本,这些脚本对我们所有的依赖项进行了 apt-get 安装,安装了应用程序所需的所有鸡蛋和其他包,将应用程序本身安装在/opt(在chroot),安装 supervisord(进行进程管理)并进行设置。现在,这个分区是一个完全独立的 Linux 文件系统,其中包含应用程序和运行它所需的一切。您可以将其转储到任何地方,在其中 chroot 并启动应用程序。它与外部世界的唯一依赖关系是它将用于其服务的端口和 supervisord 控制套接字。这是重点。我们能够准确地包含一些应用程序所需的内容(编译文件、仅 .pycs 等),并且不必为标准安装工具的任何限制而烦恼。
  5. 在此之后,我们打包了一些额外的脚本,这些脚本将进入外部操作系统。这些是为我们必须支持的每个发行版定制的。这部分是特定于发行版的。有一些脚本会进入 /etc/init.d 和一些脚本会在开始时设置数据库和东西。
  6. 然后我们使用 makeself 创建了整个文件系统的存档。它将校验和所有内容,并提供一个自解压存档,如果运行它将把整个东西解压到主机上的 /opt 中,在目录中 chroot 并运行一个设置脚本,该脚本会询问用户一些问题,如 db 用户名/密码等并进行设置。之后,它将获取我在第 5 步中提到的脚本并将它们放在主机操作系统上。

initscripts 会简单地 chroot 进入分区并启动 supervisord。然后它将负责启动我们关心的所有服务。关闭应用程序只需连接到正在运行的 supervisord 并运行一个命令。我们将其包装在 initscript 中,以便用户体验类似于 UNIX。

现在,我们将为客户端提供自解压 .run 文件。他们会运行它,被问到几个问题,它会在 /opt 下创建一个目录,其中包含我们的应用程序及其所有依赖项。初始化脚本将被修改以在启动时启动我们的应用程序,并且一切都会按预期工作。

我认为第 4 步让您可以随意安装任何您想要的东西,以便一切正常。

关于python - 以专业的方式打包和发送 python 库和脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5661385/

相关文章:

Python 单行调用函数列表

python - 如何将函数应用于 pandas 数据框中列中的每个值?

Python - 无法访问特定的 div [Urllib、BeautifulSoup,也许是 Mechanize?]

python - numpy float的 "resolution"参数到底是什么

python - 两组标记之间的相似度得分

python - 在公司防火墙后面时 azcli 出现问题

python - 在树莓派中安装 google-auth (Python)

python - 如何使用xlwings pyhton更改范围列的数字格式

python - python 中自制随机数生成器的问题。 (使用时间.时间())

python - 如何在没有任何顺序的情况下更新我的数据库对象?