【问题标题】:How do I use py2app with Anaconda python?如何将 py2app 与 Anaconda python 一起使用?
【发布时间】:2016-09-07 21:19:08
【问题描述】:

我正在使用 Anaconda 发行版中的 Python 3,并尝试将简单的 Python 程序转换为 OS X 应用程序(在 El Capitan 上运行)。按照the tutorial中的说明,我跑了

py2applet --make-setup my-script.py
python setup.py py2app -A

一切正常,没有错误,但是当我尝试启动应用程序时,我收到以下错误消息:

my-script:无法(原文如此)定位 python 运行时。您可能需要安装 Python 的框架构建,或编辑此应用程序 Info.plist 文件中的 PyRuntimeLocations 数组。

我理解这意味着我应该添加 Anaconda 的 python 的路径(在我的 bash PATH 中,但启动器不知道)。但是,应用程序自动生成的Info.plist 已经指向 Anaconda python 二进制文件:

<key>PythonInfoDict</key>
<dict>
    <key>PythonExecutable</key>
    <string>/Applications/Experimental/anaconda/bin/python</string>
    ...

我看不出这里有什么需要解决的。我已经阅读了这些相关问题:

第一个问题涉及相同的错误消息,并按照第二个问题中的建议解决。但据我了解,这些问题描述了相反的情况: OP 正在运行与操作系统一起分发的 python,并且想要分发他们的应用程序;解决方案是使用单独安装的python。我 am 使用非系统 python,我还没有尝试分发任何东西。那么是什么造成了这里的麻烦,解决方法是什么?

【问题讨论】:

  • 您是否尝试过不使用别名选项(例如python setup.py py2app)或open -a dist/MyApplication.app 运行应用程序?
  • 有用的建议! open -a dist/my-script.app 失败(“无法找到名为 'dist/my-open.app' 的应用程序”),但尝试完整的应用程序构建(仍然不起作用但)解决了问题:libpython dll 未命名正如 py2app 所期望的那样。我可以通过编辑生成的Info.plist 来修复它。

标签: python macos anaconda py2app


【解决方案1】:

@l'L'l 的建议让我能够确定问题所在:虽然在“别名模式”下生成应用程序时没有错误(使用环境符号链接而不是复制二进制文件),但构建应用程序时没有别名模式清除了错误:py2app 在不存在的名称 /Applications/anaconda/lib/libpython3.4.dylib 下查找 libpython DLL。

快速检查显示 Anaconda 以稍微不同的名称提供此 DLL:libpython3.4m.dylib。虽然修补 dist/my-script.app/Contents/Info.plist 可以解决问题,但正确的解决方案是编辑 setup.py 以便将来的构建能够正常工作。在py2app documentation的帮助下,我整理了以下内容(显示了setup.py的部分内容):

OPTIONS = {'argv_emulation': True,
           'plist': {
               'PyRuntimeLocations': [
                '@executable_path/../Frameworks/libpython3.4m.dylib',
                '/Applications/anaconda/lib/libpython3.4m.dylib'
               ]
           }}

setup(
    app=APP,
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)

路径来自生成的Info.plist;我只修改了绝对路径,原因是如果我在相对路径中提供了一个本地 DLL,它将具有默认名称。

【讨论】:

  • 您是如何找到这两个 DLL 的?我有同样的问题,并尝试包含我可以在 PyRuntimeLocations 中找到的一个 DLL:/Users/***/anaconda/lib/libpython3.5m.dylib。不过,这似乎没有什么区别。事实上,我尝试包括 /Users/***/anaconda/lib/nonsense.dylib 并没有改变,没有抛出错误。
  • 我只是cd'd 到包含文件py2app 的目录试图包含,并检查还有什么。但你也可以试试mdfind -name libpython(如果你在OS X上;否则我猜是locateslocate)。但是您是说您实际上没有看到我在回答中描述的错误?您是否尝试在非别名模式下构建?如果你这样做了,但没有收到错误消息,那么你可能遇到了不同的问题。
  • 澄清一下:我得到了和你一样的错误,并且正在非别名模式下构建。 py2app 在编译时也会给出这个错误消息:ValueError: '/Users/***/anaconda/lib/libpython3.5.dylib' does not exist 但是无论我在“plist”中输入什么,py2app 都会给我同样的错误,即:{'PyRuntimeLocations': ['/Users/****/anaconda/lib/nonsense.dylib']}。然后当我尝试打开它时给我“编辑 PyRuntimeLocations”错误。所以看起来它实际上并没有使用 PyRuntimeLocations。我想知道你是如何让 PyRuntimeLocations 真正工作的。
  • 我通过放入一个实际存在的 DLL 的路径来让它工作。如果编辑setup.py,则需要重新运行py2app(即python setup.py py2app)。
  • 你一定对something感到困惑,因为写一个无意义的名字当然会给你和自动插入的文件一样的错误:两个文件都不存在。在您的第一条评论中,您说“没有任何改变,没有引发错误”……所以不确定您实际上在做什么。仔细检查您提供的库名称是否正确。 (仅示例:您的用户名中可能有重音,打开了编码问题的大门?)无论如何,我只在尝试使用open -a 打开应用程序时才看到错误,而不是在构建时。
猜你喜欢
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 2016-08-20
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
相关资源
最近更新 更多