我需要自动化跨平台应用程序构建。整个构建在Windows机器上运行。部分内容是用Python编写的,并为OS X编译。目前,这部分版本是在OS X上手动完成的。
我尝试了pyinstaller,但看起来它只是为正在运行的平台构建。我也尝试了py2app但它没有在Windows上安装。
是否有任何工具可以在Windows机器上将Python脚本编译到OS X应用程序?
答案 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')
现在您想要运行构建工具,无论它是什么。您需要使用run
或sudo
,具体取决于该工具是否需要管理员权限。
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。