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