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

时间:2016-01-13 16:40:45

标签: python macos build pyinstaller py2app

我需要自动化跨平台应用程序构建。整个构建在Windows机器上运行。部分内容是用Python编写的,并为OS X编译。目前,这部分版本是在OS X上手动完成的。

我尝试了pyinstaller,但看起来它只是为正在运行的平台构建。我也尝试了py2app但它没有在Windows上安装。

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

3 个答案:

答案 0 :(得分:8)

简答:

显然,使用您提到的标准工具集并没有简单的方法。我概述了一个完全无法解决的解决方案,可能过于复杂而无法考虑。

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

借鉴可信和/或官方来源:

micheal0x2a's 中的 Create a single executable from a Python project 优秀答案中已经列出了很长且精选的选项列表,其中概述了可用于创建独立发行版的大多数工具一个Python程序。一条线突出:

  

另外,除非另有说明,否则 下面列出的所有程序都会生成专门针对其运行的操作系统的exe。

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

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

bbfreeze :未维护,没有关于限制的文档通常被此列表中的其余部分取代。

PyInstaller :根据他们的documentation

  

PyInstaller针对Windows,Mac OS X和Linux进行了测试。 但是,它不是交叉编译器:制作Windows应用程序,在Windows中运行PyInstaller;制作一个Linux应用程序,你可以在Linux等中运行它。 PyInstaller已成功用于AIX,Solaris和FreeBSD,但没有针对它们进行测试。

PyInstaller曾尝试支持交叉编译(来自Linux - > Windows),但 later dropped the idea

cx_freeze :在 Freezing for other platforms 列表中查看 Frequently Asked Questions 问题:

  

cx_Freeze适用于Windows,Mac和Linux,但 在每个平台上它只生成在该平台上运行的可执行文件。因此,如果要冻结Windows程序,请在Windows上冻结它;如果你想在Mac上运行它,请在Mac上冻结它。

py2app :这不是一个选项,因为py2app仅支持基于其注释的OSX计算机:

  

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

所以在Windows上安装它是不行的。

这包含了可用于在Windows上创建独立应用程序的工具。即使不在Windows上,但解决方案不存在用于创建与操作系统无关的工具

实现这些目标的普遍共识是通过虚拟机;您创建目标操作系统的VM映像,在vm中运行该操作系统的专用工具,然后将捆绑的可执行文件传输到兼容的计算机。由于OSX通常不容易虚拟化,据我所知,你在这里运气不好。

一种复杂的可能方式:

现在,我之所以说没有简单的方法可以做到这一点是因为可能有一个,但从我所看到的,它是如此乏味,你甚至不应该考虑它。我们在这里面临的一般问题是,Windows的可执行文件与OSX完全不兼容,哎,Linux executables aren't either所以我们需要的是交叉编译的能力。

我听过 supports cross-compilation 的一个编译器是 clang 。因此,为了弥补可执行文件的不兼容性,理论上你可以使用clang作为交叉编译器。问题是,这不是一项简单的任务;从 it is riddled with complex issues (From OSX to Windows example) 开始,这可能比你愿意做的更难。

如果确实找到了解决方法,那么现在需要python脚本中的.cpp/.c文件。值得庆幸的是,这可以通过使用 Nuitka Cython 等工具来完成。

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

我没有多多关注它们,但对于Nuitka,我知道它也可用于创建 standalone executable when passed the --standalone flag (请参阅:转移到其他计算机)。所以,理论上你可以使用Nuitka和clang配置为OSX进行交叉编译。然后你可以休息; 你已经赢得了它。

答案 1 :(得分:2)

在Windows计算机上安装fabric (Python module, easily installed with 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')

我们走了。很简单。不需要VM - 只需自动执行您之前已手动执行的过程。唯一真正的要求是在构建过程中必须可以连接Mac。如果您没有随时可用的Mac服务器,请考虑选择使用过的Mac Mini - 如果需要预算,您可以在ebay上以低至50美元的价格购买它们。

答案 2 :(得分:0)

您可以使用像这样的 docker 镜像 https://github.com/sickcodes/Docker-OSX 来模拟 Mac 计算机。

然后,您可以从这个模拟的 mac 安装 pyinstaller 并从那里运行您的命令。

这将生成所需的文件。

有些人用同样的方法在 linux 上使用 pyinstaller 创建 Windows 可执行文件。

我不明白为什么这不能从 windows 到 mac。