如何使 Python 模块可共享?

Posted

技术标签:

【中文标题】如何使 Python 模块可共享?【英文标题】:How to make Python module shareable? 【发布时间】:2018-09-16 08:04:05 【问题描述】:

我们有一个基于 python 的模块,我们希望通过创建一个 linux 系统可以理解的编译副本(即 .so 文件)来分发给我们的客户

我们已经评估了 cython,它很容易做到这一点,但我们看到它创建的 .so 文件与 .pyx/.py 文件一样多,但我们想制作一个 uber .so 文件来完成整个包。我们希望巧妙地做到这一点,如果我们将来向其他模块添加依赖项,uber 编译的文件应该具有所有依赖项。

任何建议,我们如何才能巧妙地做到这一点?

【问题讨论】:

是否可以将它们编译为静态库 (.a) 而不是动态库(最终产品仍将是动态的)? Python 只允许每个.so 一个模块。我建议将你的库打包成一个***。那么.so 文件的数量就意味着更少了。他们只需要处理一个文件。 创建一个 uber 编译文件背后的想法是减少内存占用,我正在检查在 python 程序中导入任何 3rd 方模块并运行此类程序的多个实例线性消耗内存,我想创建 .so因此,随着同一程序执行次数的增加,比例集大小(PSS)可以减小。如果创建一个***可以做到这一点,我很想知道我们如何做到这一点? @kabanus 如何将 .a 库导入任何 python 程序,我知道我可以将任何基于 .so 的 python 模块导入 py 程序。 @VardanGupta 您可以将 .a 文件合并到带有gcc.so 文件。此外,另一种选择是在编译之前通过一些脚本将您的代码合并为一个。 【参考方案1】:

cx_freeze 可以创建可重新分发的 python 模块包。

例如:

cxfreeze my_script_using_my_python_module.py --target-dir dist

是编译python包还是常规python并不真正相关。相关的是,您的客户需要具有兼容的 python 版本以及兼容的 libc/gcc 才能运行它。

因此,出于向第三方分发 python 模块的目的,单个.so与所有人兼容。永远。

cx_freeze 捆绑了所需的 python 解释器版本和 python 包,因此没有依赖关系。它也是跨平台的。

【讨论】:

完全同意您的观点,即 .so 永远不会与每个客户兼容,但更重要的是,我们正在努力改善内存消耗。谈到一些统计数据,我们依赖于 python repo,它在基本用法上,如 import ,占用 50MB,我们想运行 1000 多个类似的进程,如果我们可以使分发共享,我们肯定会提高并发执行。关于 cxfreeze,如果它可以帮助我们,我们一定会试一试!谢谢 非常怀疑您编写的python代码占用了50MB。它主要是python解释器。这样 50MB 将在该解释器中的所有线程之间以及 Linux 上的进程之间共享,作为共享进程内存。无论哪种方式,cx_freeze 都会捆绑运行给它的任何 python 脚本。如果它启动 1000 个进程,它们都将共享相同的 python 分布。

以上是关于如何使 Python 模块可共享?的主要内容,如果未能解决你的问题,请参考以下文章

共享时如何使 URL 字符串具有可链接性

如何使静态网站的内容可共享

Python共享读内存

如何在两个模块之间共享数据库模型?

在 Python 模块之间共享列表

python中各模块变量共享的问题。