<p>如果您打算分发应用程序,那么python二进制文件的符号链接就不能保证工作,因为通常在开发机器上,系统python不是默认的python,普通用户很可能不会安装Qt和PyQt。</p>
<p>一个更可靠的方法是使用一个本地OSX引导二进制文件来启动PyQt应用程序。<a href="https://pythonhosted.org/py2app/" rel="nofollow noreferrer">py2app</a>和<a href="http://www.pyinstaller.org/" rel="nofollow noreferrer">PyInstaller</a>都可以生成本机包装器。虽然<a href="https://pythonhosted.org/py2app/" rel="nofollow noreferrer">py2app</a>对于创建一个别名为<em>的</em>应用程序很有效,即一个包装器,它可以符号链接到系统上的现有文件,使它只绑定所需的PyQt依赖项,但事实证明这并不简单。此外,如果将<a href="https://pythonhosted.org/py2app/" rel="nofollow noreferrer">py2app</a>生成的带有<code>--aliased</code>标志的“别名应用”移动到另一个文件夹,则它将停止工作,因为符号链接是相对于最初运行生成脚本的文件夹的。</p>
<h2>PyInstaller安装程序</h2>
<p><a href="http://www.pyinstaller.org/" rel="nofollow noreferrer">PyInstaller</a>开箱即用,最后我得到了一个OSX包,其中包含了16MB左右的依赖项。</p>
<p>将python脚本绑定到独立的OSX应用程序:</p>
<pre><code>pyinstaller -w --noconfirm -i=myappicon.icns --clean -F myscript.py
</code></pre>
<p>这将生成一个独立的捆绑包,在OSX标题栏中以应用程序名的形式显示<code>.setWindowTitle()</code>中的所有内容。<code>-w</code>开关非常重要,因为它将使用正确的<code>.plist</code>文件创建一个MacOS应用程序包。</p>
<p>注意:由于某些原因,通过<code>pip</code>安装的<code>pyinstaller</code>版本对我不起作用。所以我删除了最初的pip版本(<code>pip uninstall pyinstaller</code>),并安装了最新的<a href="https://github.com/pyinstaller/pyinstaller" rel="nofollow noreferrer">^{<cd8>} branch from github</a>,其中:</p>
<pre><code>pip install -v -e git+https://github.com/pyinstaller/pyinstaller.git@develop#egg=pyinstaller-github
</code></pre>
<p>在那之后,它就像一个符咒。</p>
<h2>Mac自动机</h2>
<p>创建应用程序包装的另一个选项是使用<a href="https://support.apple.com/guide/automator/welcome/mac" rel="nofollow noreferrer">Automator</a>(在Spotlight中键入名称),转到File>;New>;Application>;搜索并将<em>Run shell script</em>拖到编辑器中,然后在<em>shell</em>下选择<code>bash</code>,<code>python</code>。您还可以使用<em>运行apple script</em>并使用apple脚本引导您的应用程序-如果您需要(例如)询问用户的密码以便以提升的权限运行,这将非常有用。</p>
<p>Automator的一个更好的替代品是<a href="http://sveinbjorn.org/platypus" rel="nofollow noreferrer">Platypus</a>-一个免费的开源应用程序,它将各种类型的脚本打包到OSX应用程序中,并且还提供一些额外的功能,如gui文本输出窗口、以管理员权限运行、设置自定义图标等。这些代码在<a href="https://github.com/sveinbjornt/Platypus" rel="nofollow noreferrer">github</a>上可用。</p>
<p>还可以选择在Xcode中创建一个barebones OSX应用程序,它将启动PyQt脚本(例如<a href="https://stackoverflow.com/questions/412562/execute-a-terminal-command-from-a-cocoa-app">here</a>),并执行应用程序所需的其他自定义任务。</p>
<blockquote>
<p>NOTE: Keep in mind that an app bundle that calls your python code with a predefined interpreter is a 'shallow' app bundle, and will depend on whatever python dependencies you have install locally. Most likely will not work OOTB on someone else's Mac.</p>
</blockquote>
<h2>努伊特卡</h2>
<P>您可能还想尝试<a href="http://nuitka.net/" rel="nofollow noreferrer">Nuitka</a>(^ {CD11>}),它旨在通过将Python代码转换为C++并编译它来构建真正的本地可执行文件。</p>
<p>使用<code>nuitka</code>构建本机应用程序的示例:</p>
<pre><code>nuitka3 --follow-imports --python-flag=no_site --verbose --standalone --show-progress --show-modules --output-dir=my_build_dir myscript.py
</code></pre>
<p>这将使用<code>my_build_dir</code>文件夹中的库创建mac可执行文件。您需要自己将它们包装在MacOS应用程序包中,例如使用<a href="http://sveinbjorn.org/platypus" rel="nofollow noreferrer">Platypus</a>或<a href="https://support.apple.com/guide/automator/welcome/mac" rel="nofollow noreferrer">Automator</a>。</p>