【问题标题】:How to create OS X app with Python on Windows如何在 Windows 上使用 Python 创建 OS X 应用程序
【发布时间】:2016-04-18 18:05:09
【问题描述】:

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

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

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

【问题讨论】:

    标签: python macos build pyinstaller py2app


    【解决方案1】:

    简答:

    显然,使用您提到的标准工具集没有简单的方法可以做到这一点。最后我概述了一个完全不可能的解决方案,它可能太复杂而无法考虑。

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


    来自可靠和/或官方来源:

    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:根据他们的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:查看他们的 Frequently Asked Questions 列表中的 Freezing for other platforms 问题:

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


    py2app:这不是一个选项,因为 py2app 根据他们的注释仅支持 OSX 机器:

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

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

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

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


    一种复杂的可能方式:

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

    我听说过的一个编译器 supports cross-compilationclang。因此,为了解决可执行文件的不兼容问题,理论上您可以使用 clang 作为交叉编译器。问题是,这不是一个简单的任务;自从 it is riddled with complex issues (From OSX to Windows example) 以来,这可能比你愿意做的事情要难得多。

    如果你确实找到了一种方法,你现在需要一个来自 python 脚本的.cpp/.c 文件。值得庆幸的是,这可以通过使用 NuitkaCython 等工具来完成。

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

    我没有深入研究它们,但是对于 Nuitka,我知道它也可以用于创建 standalone executable when passed the --standalone flag(请参阅:迁移到其他机器)。所以,理论上你可以使用带有 clang 的 Nuitka 来为 OSX 进行交叉编译。然后你就可以休息了; 你赢得了它。

    【讨论】:

    • cx_freeze 、 py2app 和 pyinstaller 与 hashlib 等一些库有问题,有时(在 osx 上)输出给出非法指令错误,但 Nuikta 是迄今为止最好的东西,(最小尺寸, 1mb 输出,而同一源使用 cx_freeze 、 py2app 和 pyinstaller 提供 6 mb 输出),没有库问题,没有非法指令错误(在视网膜显示器上编译的应用程序在非视网膜显示器上工作)
    【解决方案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')
    

    我们去吧。很简单。不需要虚拟机 - 只需自动化您之前已经手动执行的过程。唯一真正的要求是您的 Mac 必须在构建过程中可以连接。如果您没有现成的 Mac 服务器,可以考虑购买一台二手 Mac Mini - 如果预算有限,您可以在 ebay 上以低至 50 美元的价格买到它们。

    【讨论】:

      【解决方案3】:

      你可以像这样使用docker镜像https://github.com/sickcodes/Docker-OSX来模拟mac电脑。

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

      这将产生所需的文件。

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

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

      【讨论】:

      • 似乎还有一个Windows docker image。这可以通过其他方式实现:从 Mac 为 Windows 构建
      猜你喜欢
      • 2011-11-07
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 2012-10-15
      • 2016-03-18
      • 1970-01-01
      相关资源
      最近更新 更多