py2exe的跨平台替代方案

17 投票
3 回答
32399 浏览
提问于 2025-04-17 11:13

py2exe非常好用,我每次想把一个Python程序打包成可以在Windows系统上运行的程序时都会用到它。

我想问的是,有没有类似的工具可以让我在Windows上打包程序,然后在Linux上运行呢?

3 个回答

5

我真的怀疑你能做到这样的事情。

你可以做的是配置三个虚拟机,一个用Windows,一个用MacOS,还有一个用Linux,这样每个虚拟机里都有你运行程序所需的一切。

然后你可以使用py2exe、py2app或者pyinstaller的组合,分别为每个平台生成一个安装包。这样你就会有三个不同的安装包,但每个包都打包得很好,用户在他们的电脑上不需要再安装其他东西。

8

这里还有一个叫 PyInstaller 的工具,它支持Linux、MacOS和Windows。我还没用过(还没尝试),所以不太确定能不能在Windows上打包成Linux用的程序,不过从手册上看,似乎是有这个可能的。

补充: 常见问题明确说明了,不能从Linux创建Windows的包,也不能从Linux创建MacOS的包。关于能不能从另外两个系统创建Linux包没有说明,但可能也不行。

补充2: 我稍微搜索了一下,发现了 cx_freeze,这个工具也许值得一试。

2

好的,我已经完成了这个。虽然有点小技巧,但对于我的需求来说效果很好。

简单来说,就是用ModuleFinder这个工具来找到所有被导入的模块,然后把系统自带的模块过滤掉,接着把剩下的模块编译并打包成压缩文件。

不过,我的代码里有很多额外的复杂部分,这些和这个问题没有关系,所以我不能提供一个完整的程序,只能给出一些代码片段:

zipfile = ZipFile(os.path.join(dest_dir, zip_name), 'w', ZIP_DEFLATED)
sys.path.insert(0, '.')
finder = ModuleFinder()
finder.run_script(source_name)

for name, mod in finder.modules.iteritems():
    filename = mod.__file__
    if filename is None:
        continue
    if "python" in filename.lower():
        continue

    subprocess.call('"%s" -OO -m py_compile "%s"' % (python_exe, filename))

    zipfile.write(filename, dest_path)

撰写回答