如何在Windows上使用Python创建OS X应用程序

19

我需要自动化跨平台应用程序构建。整个构建过程在Windows机器上运行。其中一部分使用Python编写并编译为OS X系统。目前,该构建的这一部分在OS X上手动完成。

我尝试了pyinstaller,但它似乎只能在其运行的平台上构建。我还尝试了py2app,但它无法在Windows上安装。

是否有任何工具可以在Windows机器上将Python脚本编译为OS X应用程序?

3个回答

20

简短回答:

显然,使用您提到的标准工具没有简单的方法可以完成此任务。我在最后概述了一个完全不太可能的解决方案,可能过于复杂而无法考虑。

最终结果:继续手动操作,这可能是目前最好的选择。


从可靠和/或官方来源获取信息:

已经有一个长而精选的选项列表在micheal0x2a's卓越的答案中指定,在Create a single executable from a Python project中概述了大多数用于创建Python程序独立分发的工具。其中一行引人注目:

此外,除非另有说明,下面列出的所有程序都将为其运行的操作系统生成exe文件。

我可能读错了,但没有明确说明跨平台支持。

类似的列表可以在Distribution UtilitiesFreezing Your Code — The Hitchhiker's Guide to Python中找到。从中我们可以看到Windows支持的项目:


bbfreeze:该工具未维护,通常被下面列表中的其他工具所替代,没有关于限制的文档。


PyInstaller:根据他们的文档

PyInstaller已在Windows、Mac OS X和Linux上进行了测试。 但是,它不是跨编译器:要创建Windows应用程序,您需要在Windows上运行PyInstaller;要创建Linux应用程序,您需要在Linux上运行PyInstaller等。 PyInstaller已成功地与AIX、Solaris和FreeBSD一起使用,但未经过测试。

PyInstaller曾经尝试支持交叉编译(从Linux -> Windows),但是后来放弃了这个想法


cx_freeze:在他们的常见问题列表中看到了关于其他平台的冻结的问题:

cx_Freeze可以在Windows、Mac和Linux上工作,但是在每个平台上它只能生成在该平台上运行的可执行文件。因此,如果您想要将程序冻结为Windows版本,请在Windows上进行冻结;如果您想要在Mac上运行它,请在Mac上进行冻结。


py2app: 因为 py2app 只支持 OSX 系统,所以它不是一个选项,如他们的注释所述:

注意:py2app 必须在OSX上使用来构建应用程序,它无法在其他平台上创建Mac应用程序

因此,在Windows上安装它是行不通的。

这就结束了在Windows上创建独立应用程序可用的工具。即使不在Windows上,也不存在用于创建操作系统不可知工具的解决方案

实现这些功能的一般共识是通过虚拟机;您创建目标操作系统的虚拟机映像,在虚拟机中运行该操作系统的专用工具,然后将打包的可执行文件传输到兼容的机器上。从我所知道的情况来看,由于OSX通常不易于虚拟化,您可能会在这里运气不好。


一种复杂的可能方法:

现在,我说没有简单的方法是因为可能有一种方法,但是从我的观察来看,它太繁琐了,你甚至不应该考虑它。我们面临的一般问题是,Windows可执行文件与OSX根本不兼容,甚至Linux可执行文件也不兼容所以我们需要的是交叉编译的能力。

我听说有一种编译器支持交叉编译,它就是clang。因此,为了解决可执行文件的不兼容性问题,理论上你可以使用clang作为交叉编译器。但问题是,这不是一个简单的任务;它可能比你愿意做的要难得多,因为它存在着复杂的问题(例如从OSX到Windows)

如果你真的找到了一种方法,那么现在你需要从你的Python脚本中获取.cpp/.c文件。幸运的是,可以使用像NuitkaCython这样的工具来完成这项工作。

这些的主要思想是相同的,输入 .py ,输出 .cpp/.c。第二个棘手的部分可能是设置clang编译器与这些一起使用。老实说,我不知道是否有人做过这个。

我没有深入研究它们,但对于Nuitka,我知道它也可以用来创建一个独立可执行文件,当传递--standalone标志时(参见:移植到其他机器)。所以,理论上你可以使用配置为交叉编译OSX的clang的Nuitka。然后你就可以休息了;你应该得到回报了。


cx_freeze、py2app和pyinstaller在某些库(如hashlib)方面存在问题,有时(在OSX上)输出会出现非法指令错误。但是,到目前为止,Nuikta是最好的选择(最小尺寸,1MB输出,而使用cx_freeze、py2app和pyinstaller编译相同源代码会得到6MB输出),没有库问题,也没有非法指令错误(在Retina显示器上编译的应用程序可以在非Retina显示器上运行)。 - Koorosh Ghorbani

9

你可以使用 Docker 镜像 https://github.com/sickcodes/Docker-OSX 模拟 Mac 计算机。

然后从这个模拟的 Mac 上安装 PyInstaller,并从那里运行你的命令。

这样就可以得到所需的文件。

有些人也会用同样的方式在 Linux 上使用 PyInstaller 创建 Windows 可执行文件。

我认为这种方法在 Windows 到 Mac 上同样可以奏效。


2
似乎也有一个Windows Docker镜像。这可以实现另一种方式:从Mac构建Windows。 - mihca
你尝试过在Windows和Mac之间进行兼容性测试吗?我在哪里可以获得使用它的帮助?我已经查看了他们的Discord频道。 - xlmaster

2

在你的Windows机器上安装fabric(Python模块,可通过pip轻松安装),这样你就可以作为同一自动化构建流程的一部分在Mac上运行构建。

Fabric允许你从Python中利用SSH。只要你知道如何通过SSH访问Mac(只需要IP、用户名和密码),这很容易。设置方法如下:

from fabric.api import env

env.host_string = '<IP of the Mac Here>'
env.user        = '<Username on the Mac>'
env.password    = '<Password of the user>'

接下来,按照以下方式从Windows计算机复制必要的源文件到Mac(一旦上述步骤中设置了fabric):

from fabric.operations import put

put(r'\path\to\local\source\files', '/path/to/where/you/want/them')

现在你想运行你的构建工具,无论它是什么。你需要使用runsudo来运行它,取决于该工具是否需要管理员权限。
from fabric.operations import run, sudo

# sudo works the same as run if you need that instead
run('/path/to/build/tool arguments for build tool')

最后,您可以使用get获取构建输出。

from fabric.operations import get

get('/path/to/dist/on/mac', '\local\path\to\store\on\windows')

我们来看这个问题。相当简单。不需要虚拟机 - 只需自动化您以前手动执行的过程即可。唯一真正的要求是在构建过程中必须能够连接到您的 Mac。如果您没有现成的 Mac 服务器可用,请考虑购买一台二手 Mac Mini - 如果预算有限,您可以在 ebay 上以低至 50 美元的价格购买。


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