【问题标题】:Souce code getting packaged in python wheel源代码被打包在 python 轮子中
【发布时间】:2020-11-18 21:17:12
【问题描述】:

我们正在使用轮子将代码部署到 QA/生产。最近我们发现/意识到轮子包实际上是存储我们的源代码。并且通过下面的简单命令将打开其中的所有源代码。

unzip package.whl

用于创建车轮的命令如下

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

所以,

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

【问题讨论】:

标签: python-3.x deployment pip pypi python-wheel


【解决方案1】:

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

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

这意味着wheel(和任何其他发行版)本身不是二进制文件,但它可能包含特定于平台的二进制文件——例如,如果您正在构建/编译一些 C 代码以及您的 Python 包。

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

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

有没有办法创建轮子来创建二进制文件并存储在包中而不是源代码中?

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

【讨论】:

    【解决方案2】:

    如果有人像我一样在这里绊倒。如果你

    1. 使用Cython 预编译您的库。
    2. 不仅有.pyx,还有.py 模块。例如,您想在不进行任何修改的情况下对某些现有项目执行此操作(setup.py 除外),或者认为首先这样做是不合理的,因为Cython 也会消耗.py 文件。
    3. 想要分发不包含任何.py 文件的预编译库(可能为空的__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},
        # ...
    )
    

    【讨论】:

      猜你喜欢
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 2018-06-13
      • 2018-05-26
      相关资源
      最近更新 更多