源代码打包在 python wheel 中

Souce code getting packaged in python wheel

我们正在使用轮子将我们的代码部署到 QA/Production。最近我们 found/realized wheel packages 实际上存储了我们的源代码。通过下面的简单命令将打开其中的所有源代码。

unzip package.whl

创建轮子的命令如下

cd /path/to/source/code/folder
python setup.py bdist bdist_wheel

所以,

  1. 有没有什么方法可以创建轮子来创建二进制文件并存储在包中而不是源代码中?

在最简单的意义上,wheel就是:

  • 一个 zip 文件
  • 具有特定文件名
  • 和特定的目录布局
  • 含纯Python源代码
  • 和任何特定于平台的二进制文件

这意味着 wheel(和任何其他发行版)本身不是二进制文件,但它可能包含特定于平台的二进制文件——例如,如果您是 building/compiling 一些 C 代码连同您的 Python 包裹。

大多数 wheel 都是纯 Python,这意味着它们 包含 Python 源代码。

您似乎在问如何将 Python 代码“编译”为经过混淆处理的二进制文件。这不是 wheel 的目标。您可能想在此处阅读有关 wheel 格式的更多详细信息:https://www.python.org/dev/peps/pep-0427/

Is there any way to create wheels which creates binary and stores in package rather than source code?

不适用于 wheel 格式。如果这确实是您的目标,您可能需要查看 pyinstallerpy2execython,具体取决于目标平台。

万一有人像我一样在这里跌跌撞撞。如果你

  1. 使用 Cython 来 pre-compile 您的图书馆。
  2. 不仅有.pyx个模块,还有.py个模块。例如,您想在不做任何修改的情况下对某些现有项目执行此操作(setup.py 除外),或者一开始就认为这样做是不合理的,因为 Cython 也会消耗 .py 文件)。
  3. 想要分发不包含任何 .py 文件的 pre-compiled 库(可能是空的 __init__.py 文件除外)。

然后,您可以应用以下(非常肮脏的)解决方案从轮盘中排除您想要的任何文件:

from wheel.bdist_wheel import bdist_wheel

class CommandBdistWheel(bdist_wheel):
    
    # Called almost exactly before filling `.whl` archive
    def write_wheelfile(self, *args, **kwargs):
        dr = f'{self.bdist_dir}/<package name>'
        paths = [
            path for path in glob.glob(f'{dr}/**/*.py', recursive=True)
            if os.path.basename(path) != '__init__.py'
        ]
        for path in paths:
            os.remove(path)
        super().write_wheelfile(*args, **kwargs)

setup(
    # ...
    cmdclass={'bdist_wheel': CommandBdistWheel},
    # ...
)