包装和运送python库和脚本,专业的方式

Ste*_*ini 37 python

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

  1. 一个python库(由我们开发)
  2. 一些python程序取决于上面的库
  3. 我们不是开发的其他库,但它们是我们库的依赖项.
  4. 一个完整的python安装(python 2.6)
  5. 其他语言的其他东西,库和程序.这里不是问题,因为它们没有被上述机器所吸引,而且目前的运输过程已经有效.

该捆绑包出货到Linux,OSX和Windows.在Linux上,它以简单的tar.gz形式发布.用户只需解压缩tar.gz和source提供的bash脚本.bashrc,以便正确设置环境.在Mac上,这是一个dmg.在窗户上,我不知道.Windows家伙今天不在这里,但我看到的是以某种方式创建了一个exe.

我现在将更详细地解释上述几点.

我们的Python库

我们不想给出源代码,所以我们只想提供已编译的python文件.一个更好的策略,使它们更加防篡改是受欢迎的,即使它涉及一些深度黑客(例如我曾经看到魔术从.zip导入的东西被"损坏"ad-hoc).目前该库没有C级代码或类似的平台相关代码,但这很快就会改变.因此,我们必须提供.so与pyc一起编译的特定平台.

显然,这个库将与我们的其他应用程序一起发送到包中.因此它将安装在下载的软件包上.出于这个原因,它必须是完全可重定位的,并且用户必须以某种方式(手动或通过我们的env脚本)将untarred包的位置添加到PYTHONPATH,以便解释器可以找到它.

我们的Python程序

我们将在我们的捆绑包中发送应用程序,这些应用程序将取决于我们的库.这些应用程序的代码必须是用户可见的(以便他可以学习如何使用库接口),或者不可见(对于那些我们希望保持闭源的实用程序),因此需要双重方法.

其他图书馆

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

我们的蟒蛇

我们将发布我们的python版本,我们假设用户将运行以访问我们的脚本.这是因为我们想确保运行python版本.此外,我们可能会修改可执行文件或标准库.我们可能会担心这个python与标准python的交互,如果用户想要我们的python上的特定库,它将不得不在我们的捆绑包中安装它,而不是在库的标准位置.

请求

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

Nou*_*him 15

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

它只是Linux,所以我专注于那个.我们需要发布mySQL,lighttpd,python,memcached,一些第三方Python模块和一些自定义脚本的特定自定义版本.我们需要毫无问题地启动所有这些服务,并让用户使用常规initscripts控制它们.它应该在一堆流行的发行版上工作正常,因此不应该依赖于发行版特定的东西.

我做的如下.

  1. 创建了500MB(我不记得大小)文件并将其格式化为ext3fs文件系统.
  2. 使用环回设备将其安装在某一点.
  3. deb-bootstrap在挂载点创建自定义安装Debian.
  4. Chrooted在分区内,然后运行了一堆脚本,在我们所有的依赖项上进行了apt-get安装,安装了应用程序所需的所有egg和其他软件包,将应用程序本身安装在/ 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其中包含我们的应用程序及其所有依赖项.将修改init脚本以在启动时启动我们的应用程序,事情将按预期工作.

我认为第4步可以让你自由地安装你想要的任何东西,但是你想要的东西可以正常工作.


Seb*_*ask 5

您可以使用类似于tar.gz的Makeself,但会生成一个.sh,它会自行提取并允许执行自定义安装脚本(不要问我关于Windows).这可以避免捆绑已安装的Python,这几乎肯定不会起作用 - 您可以包含安装程序.

您开发的代码和依赖项应该包含在sdist创建的包中,可以通过PIP和easyinstall安装到基于python的virtualenv中.在你的Manifest.in中你可以很容易地只包含pyc文件和其他所有必要的东西并排除py文件,所以没有人看到你的来源.依赖关系将通过下载自动安装,但您可以通过将它们包含在存档中来避免这种情况,例如依赖关系.只需将它们放入目录并将"-f file:path_to_your_directory"添加到PIP调用即可.


chm*_*lig 5

我不太明白你的用户最终如何使用该程序,所以如果这没用,请道歉.

你看过py2exepy2app吗?他们会让你在Windows和OS X上创建一个更加模糊的可执行文件,这可能更容易.更少的依赖关系和出错的事情.

我们使用py2exe部署了一个内部公司范围的应用程序,这很简单.无论用户有什么其他蟒蛇或没有我们的脚本是一个简单的向导安装程序,并且可靠地工作.它包括我们必须捆绑的许多Python和C库,以及一个python解释器.但是我们并没有试图隐藏内容,只是让它变得简单.

  • 如果您想要一个构建可执行文件的常用方法,也可以使用[gui2exe](http://code.google.com/p/gui2exe/). (2认同)