我们有没有用于 python 后端代码库的打包工具(比如 webpack)

问题描述 投票:0回答:1

我有用于后端的 python (3.0) 代码库。

我想将此代码作为捆绑包部署到其他机器上,这样它就不需要安装依赖项了。

注 1:在我的远程机器上我安装了 python 不是问题。

注2:此应用未容器化(docker)

注意 3:捆绑后,我必须在命令行上运行程序,并向程序提供一些输入参数

(就像基于 Node Js 的应用程序一样,我们使用 Webpack,它只是将所有 js 和依赖项捆绑到一个 JS 文件中,该文件可以在没有 node_modules 的任何机器上运行。)

我看到有些像“python-webpack”,但它们没有维护。

python-3.x bundle
1个回答
0
投票

遗憾的是(截至 2023 年)答案是否定的,我们没有。

主要有4个原因。

  1. 很多很多 python 模块实际上只是一堆包裹在 python 中的 C++ 代码。当模块实际上不是 python 时,不能真正“内联”python 模块。实际上,webpack/vite/browserify/babel 捆绑的所有 JavaScript 模块都是纯 JavaScript。并非所有的 NPM 模块都是纯 JS,但如果你试图捆绑一个非纯 JS 模块,它不会很好地工作。
  2. Python 的模块范围界定很糟糕。在 JavaScript 中并没有真正的“模块”的概念,JavaScript 模块只是一个 JavaScript 文件。 Python 完全不同,模块是特殊的东西,它是运行时全局对象和名称。 Python 模块可以检查它们是如何被调用的(例如 name == 'main')。
  3. Python 打包有点乱。包名与模块名不同,一个包可以有多个模块,有许多不同的结构和发布格式,比如 egg 文件、wheel 文件和 tarball。一个 python 模块在使用之前必须被解析,这可能需要很多工作。相反(并且过度简化)JavaScript 发布基本上只是在某处上传 JavaScript 文件。从字面上看,在 deno 中
    import 'https://path/to/a/file.js'
    会工作得很好。在 JS 中捆绑是递归收集所有这些 JS 文件的问题,不需要格式转换。
  4. Python 惊人地频繁使用动态导入……非常动态的导入。从技术上讲,动态导入也被 JavaScript 支持和使用,但它们更为罕见,而且每个人都知道动态导入不会被打包器可靠地获取,因此他们在编写代码时会牢记这一点。在 python 中,所有代码都是在没有考虑打包器的情况下编写的。一些 python 代码嵌套了 try-excepts,比如尝试导入 numpy(一个 C/C++ 包)只是为了查看用户是否安装了 numpy。我在 eval-ed 字符串中看到了动态导入的可怕案例(它比你想象/希望的更常见)。捆绑器几乎完全被动态导入打败了。

尽管有这些事情,仍然有人可以尝试制作 python 捆绑器,但据我所知没有人这样做过。

© www.soinside.com 2019 - 2024. All rights reserved.