将PyPy编译为可执行文件

35

我知道如何使用cx_freeze编译CPython文件为exe,但是是否可能使用PyPy编译一个简单程序为exe?


1
可能是https://dev59.com/om855IYBdhLWcg3wm1i3的重复问题。 - Roland Smith
1
这不是重复的,因为您提供的链接没有解决任何问题,并且已经过时,是2010年的,而现在我们已经到了2012年。也许自那时以来有些改变。 - Nuncjo
7
@RolandSmith那个问题特别询问了一些与py2exe不同的东西,因为它不包括Python解释器,并接受“停止编写Python并开始使用这个完全不同的语言,它恰好是Python的一个子集”作为答案。而这个问题只是要求一个类似的冻结工具,可以与PyPy和完整的Python一起使用。 - user395760
2
应该是可能的,因为(最近)嵌入PyPy变得可行:http://mail.python.org/pipermail/pypy-dev/2012-April/009726.html。所以只需要一个包装器exe,还要托管压缩库和脚本。有人愿意接手吗? - TryPyPy
6
@AoeAoe 你到底在说什么?你的陈述显示出极大的混乱和/或误解。(1)解释/编译不是编程语言的属性,而是编程语言实现的属性。任何语言都可以同时被编译和解释,包括Python。(2)将代码转换为其他语言(比如C)正是编译器的定义。(3)这些工具的全部意义就是利用现有的解释器进行可执行文件生产。【我还可以继续列举一些小细节,但评论空间已不足。】 - user395760
显示剩余2条评论
2个回答

8
据我所知,没有现成的方法或教程可以使用PyPy解释器从程序创建EXE。而且,要让事情顺利进行并不是很容易。
原则上,有两种考虑使用PyPy的翻译来获取EXE文件的方法,一种是使用PyPy解释器,另一种是编写自己的RPython程序(PyPy解释器本身就是一个RPython程序,即使用受限制的Python子集)。
如果您的程序使用了受限制的RPython子集且没有依赖项,则可以查看pypy/translator/goal中的翻译脚本,其中还有许多target*.py文件。选择一个文件并为您的目的进行修改。您可能首先想尝试从这里开始翻译Python函数:

http://doc.pypy.org/en/latest/getting-started-dev.html#trying-out-the-translator

如果你的程序是一个应用程序并依赖于外部包,你应该首先尝试确保你的程序在pypy上能正常工作 - 并不是所有的外部库都被支持。然后你可以尝试修改targetpypystandalone脚本来加载你的应用程序模块。如果有疑问,可以在pypy-dev邮件列表或irc.freenode.net的#pypy频道上寻求帮助。

RPython 的一个缺点是它没有文档,如果你的代码不恰好遵循它,翻译器将会失败并显示完全无法理解的错误信息。(例如,尝试使用命名元组会出现错误:FrozenDesc 对象没有属性 allenforced_attrs。) - Antimony
@hpk42 在2013年之后,我们可以使用pypy/rpython/bin/rpython进行翻译。另外,RPython文档也是可用的。 - nekketsuuu

-2

这是一个 py2exe 的解决方案,可能适合你:compile.py

#!/usr/bin/env python
# Corey Goldberg

from distutils.core import setup
import py2exe
import sys

if len(sys.argv) == 2:
    entry_point = sys.argv[1]
    sys.argv.pop()
    sys.argv.append('py2exe')
    sys.argv.append('-q')
else:
    print 'usage: compile.py <python_script>\n'
    raw_input('press ENTER to exit...')
    sys.exit(1)

opts = {
    'py2exe': {
        'compressed': 1,
        'optimize': 2,
        'bundle_files': 1
    }
}

setup(console=[entry_point], options=opts, zipfile=None)

6
-1 py2exe目前不支持PyPy,请先进行一些研究。为什么要链接到某个不知名的项目设置脚本,而不是py2exe项目呢? - user395760
1
@delnan:因为除非你按照secumind提供的选项告诉它这样做,否则py2exe不会产生单个文件作为输出。 - Cees Timmerman
1
@CeesTimmerman 当然,这个选项以及其他可能对OP有用的选项都应该在某个地方有记录。 - user395760
3
@delnan:在这里鼓励提供实用的答案。当然,人们可以将“py2exe”粘贴到他们的搜索栏中。 - Cees Timmerman
@CeesTimmerman,你的评论只回答了delnan评论的第二部分,所以这仍然不能算是一个“实用的答案”。无论如何,我同意delnan的观点。最好在答案中完整地描述解决方案,而不仅仅提供指向另一个网站的链接(该链接可能随时失效)。 - JBentley
1
除了这种方法可能行不通之外,链接还是失效的。 - Diomedea

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