在应用程序之间共享/管理内部python库的最佳方式

时间:2008-12-04 23:16:44

标签: python deployment shared-libraries projects-and-solutions

我们公司(xyz)正在将许多Flash代码移植到Python。

在Flash中,我们的Flash应用程序之间有一个共享库 - package xyz。我们可以对包进行更改,而不必担心在部署时破坏其他应用程序,因为Flash会编译其代码并包含库的内容。我们通过RPM部署最终的SWF,我们就完成了。对App1和App2的更新不会破坏App3。

您将如何在Python(共享库依赖项)中处理此问题。

App1,App2和App3都需要xyz-lib.rpm,并且都使用相同的库文件,但是必须针对App1,2,3 显式更新xyz-lib.rpm时间有一个新的图书馆,这真是太繁重了。

我目前最喜欢的解决方案 - 我可以让app1.rpm从打包时包含库 - 实际上是库的某种静态链接。然而,这感觉不够优雅。 (虽然唯一的额外费用是硬盘空间==便宜。)

我知道共享库的可靠管理可能是最好的解决方案,但我一直试图考虑所有开发人员都是人,并且会犯错误。我们会犯错误,我不希望部署app1来打破app2和app3 - 测试和调试只需要更多。

3 个答案:

答案 0 :(得分:4)

“每次有新库时都会针对App1,2,3进行明确测试”实际上并不是那么繁重。

两件事。

  • 您需要一组正式的API单元测试,库必须通过。这只是API,而不是功能的每一个细微差别。如果这个过去了,那么你的改变就好了。如果此操作失败,则您的更改会破坏API。

  • 您还需要一组功能单元测试,与API分开。这个更大,可能被归类为“繁重”。

一旦开始进行单元测试,就会上瘾。一旦您完成了相当完整的测试,这个问题就很容易管理。

答案 1 :(得分:1)

我已使用此cookbook entry的变体来分发python应用程序。基本上它涉及将所有python源压缩成zip文件,然后将其与shell脚本连接以导入源文件。

如果您需要为应用程序提供自己的库版本,这将非常有用。

答案 2 :(得分:1)

我也赞成将所有内容打包在一起的解决方案,并将对OS库的依赖性限制在最小(glibc就是这样)。硬盘很便宜,客户和支持时间不是。

在Windows上,使用py2exe + InnoSetup是微不足道的。

在Linux上,看起来bbfreeze是处理此问题的正确方法。从主页引用,它提供:

  • zip / egg文件导入跟踪: bbfreeze跟踪从zip文件导入的内容,如果从eggfile中使用某些模块,则包含整个egg文件。使用setuputils的pkg_resources模块的软件包现在可以使用(新增于0.95.0)
  • 二进制依赖关系跟踪: bbfreeze将跟踪二进制依赖项,并将包含冻结程序所需的DLL和共享库。