PyPy和PyInstaller

24

是否可以使用PyInstaller构建一个单一的二进制或目录包,使用pypy作为解释器?

有没有什么特殊技巧可以做到这一点?

还有其他替代PyInstaller的工具吗?

如果不行,是什么根本技术原因?

注意:PyInstaller默认情况下无法与pypy兼容,原因如下:

  • distutils.sysconfig.get_config_h_filename丢失,在pytinstaller主干中已经修复。
  • (distutils.|)sysconfig.(_|)get_makefile_filename缺失,实际上是可选的。
  • 尝试链接到libpython2.7.so.1,但在单个可执行文件的pypy中无法链接到共享对象。

PS:我也可以接受二进制补丁工具(类似于LD_PRELOAD,但结果只有一个库),如果有人能够提供演示 :) - Dima Tisnek
PyInstaller的替代方案列表。 - VivienG
1
谢谢,@VivienG,不幸的是,这些都没有声称支持“pypy”。 - Dima Tisnek
可能导致缺乏支持的一个原因是,pypy的JIT与预构建(即预编译)二进制文件不相容,这导致pyinstaller(或任何“打包器”)破坏了pypy最常见的优势,即由于JIT而带来的性能提升。 - 0xc0de
1个回答

13
我已经尝试过这个方法,但失败了,因为PyPy只能与CPython使用的一部分子集配合工作。 PyInstaller是一个完整的CPython应用程序,所以它们无法通信。
PyInstaller的机制对CPython的运行方式非常敏感,因此PyPy可能会引入一些问题。在PyPy虚拟环境中尝试运行PyInstaller时会出现以下情况:
OSError: Python library not found: Python, .Python, libpython3.5.dylib,
libpython3.5m.dylib

This would mean your Python installation doesn't come with proper library files.

This usually happens by missing development package, or unsuitable build
parameters of Python installation.

* On Debian/Ubuntu, you would need to install Python development packages
  * apt-get install python3-dev
  * apt-get install python-dev
* If you're building Python by yourself, please rebuild your Python with
  `--enable-shared` (or, `--enable-framework` on Darwin)

如果你需要提高速度并将代码隐藏起来,可以尝试使用Cython。我经常使用Cython和PyInstaller,并喜欢它们的跨平台性质。当你完成这两个工具后,可以使用PyInstaller和CPython来打包你的应用程序。

1
虽然大多数 pyinstaller 的内容在用户应用程序构建时是纯 Python 运行的,但也有“引导程序”。快速检查显示它主要是一组简单的 C 级钩子,针对 CPython 内部,但也有一些复杂的东西,例如运行时绑定到解释器内置类型,按需解包用户的 py/pyc/pyo 文件。 - Dima Tisnek
1
你说得对。当我在紧张的时间表下交付时,我会尽可能避免这些问题。这就是为什么我会使用我为你概述的方法。 - iChux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接