【问题标题】:Xcode Target Phase Python ScriptXcode 目标阶段 Python 脚本
【发布时间】:2009-11-09 00:34:35
【问题描述】:

我正在尝试将 Python 脚本添加到我的项目中,以直接从 Git 获取构建和营销号。

我创建了一个新的目标阶段,它运行如下所述的脚本:
http://yeahrightkeller.com/2008/10/19/xcode-run-script-build-phase-tip/

我已经编写了一个 Python 脚本,它使用

解析程序 Info.plist
from Foundation import NSMutableDictionary

但是脚本在编译时失败,并在构建结果中报告以下错误:

Running a custom build phase script: gitversion.py  
Traceback (most recent call last):  
File "/Users/jorge/Documents/Programming iPod/Pruebas/RowOrder/Scripts/gitversion.py", line 9, in <module>  
from Foundation import NSMutableDictionary  
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/Foundation/__init__.py", line 8, in <module>  
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC/objc/__init__.py", line 26, in <module>  
from _bridgesupport import *  
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC/objc/_bridgesupport.py", line 9, in <module>  
import pkg_resources  
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py", line 651, in <module>  
class Environment(object):  
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py", line 654, in Environment  
def __init__(self, search_path=None, platform=get_supported_platform(), python=PY_MAJOR):  
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py", line 55, in get_supported_platform  
plat = get_build_platform(); m = macosVersionString.match(plat)  
File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py", line 181, in get_build_platform  
plat = get_platform()  
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/util.py", line 97, in get_platform  
cfgvars = get_config_vars()  
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/sysconfig.py", line 525, in get_config_vars  
func()  
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/sysconfig.py", line 408, in _init_posix  
raise DistutilsPlatformError(my_msg)  
distutils.errors.DistutilsPlatformError: $MACOSX_DEPLOYMENT_TARGET mismatch: now "10.5" but "10.6" during configure  
Finished running custom build phase script: gitversion.py (exit status = 1)

显然,distutils 以某种方式硬编码它是为 10.6 版编译的(我正在使用的是雪豹),但该项目的 MacOSX 部署目标设置为 10.5。

如果我尝试在项目中将此变量设置为 10.6,则会得到:

ld: library not found for -lcrt1.10.6.o

关于如何解决这个问题的任何想法?提前致谢。

【问题讨论】:

    标签: iphone python xcode


    【解决方案1】:

    我有同样的问题,我想保留 python 版本,因为通过 NSMutableDictionary 处理 plist 比在 Info.plist 上使用正则表达式要好得多。

    基于 Maxence 的回答,解决方案是将 python 代码从运行脚本构建阶段剥离到 gitversion.py 文件中:

    #!/usr/bin/env python
    import os
    from Foundation import NSMutableDictionary
    from subprocess import Popen, PIPE
    
    p = Popen(
            "/sw/bin/git rev-parse --short HEAD", 
            stdout=PIPE, 
            close_fds=True,
            shell=True)
    
    version = p.stdout.read()
    print version
    info = os.environ['INFOPLIST_FILE']
    print info
    plist = NSMutableDictionary.dictionaryWithContentsOfFile_(info)
    print plist
    plist['revision'] = version[:-1]
    plist.writeToFile_atomically_(info, 1)
    

    然后用shell脚本替换原来的Run Script:

    env MACOSX_DEPLOYMENT_TARGET=10.6 python gitversion.py
    

    请务必记住将Shell 设置更改为/bin/sh

    【讨论】:

    • PlistBuddy 可用于读取/写入 Info.plist,仅供参考。
    【解决方案2】:

    Apple 使用 Snow Leopard (10.6) 分发 Python 2.5 和 2.6,并且两者的部署目标都是 10.6。如果您确实需要将应用程序定位到 10.5,则不能安全地使用 Apple 在 10.6 上提供的 Python 在 10.5 上进行部署。

    最简单的解决方案可能是下载并安装Python 2.6 from python.org。该 Python 的目标是 10.3+,因此它适用于 10.5 和 10.6。您可能还需要确保 Python 安装在将部署您的应用的所有计算机上。

    另一种选择可能是使用 py2app 和 python.org 2.6 创建一个单独的独立助手应用程序,并将其与您的主应用程序一起部署。或者在 py2app 下创建你的整个应用程序。在任何一种情况下,应用程序都将包含自己的 Python 框架解释器和框架,与系统版本无关。

    编辑:根据您的评论,我不确定我是否理解您的问题。由于您在 10.6 上运行,我不清楚 (1) 为什么将部署目标设置为 10.5,以及 (2) 是否需要将部署设置为 10.5。我猜你有一个现有的 Xcode 项目,它是在 10.5 上开发的,然后从 10.5 上的 Xcode 导入或升级到 10.6 上的 Xcode。如果是这种情况,那么我认为唯一需要做的就是在项目窗口顶部将 Active SDK 从 10.5 更改为 10.6(在概述中)。这样做并强制清除所有目标应该可以解决 crt library not found 错误;如果不是,则项目依赖有问题。

    另一方面,如果您确实需要在 10.6 上为 10.5 开发,那么您的 gitversion.py 似乎无意中引入了对 python 2.6 的依赖(从回溯可以看出),这不是一部分10.5。除非您真的需要 python 2.6 功能,否则您应该能够通过使用 Apple 在 10.5 和 10.6 上提供的 python 2.5 来消除它。在这种情况下,您可能需要做的就是确保在构建阶段脚本中使用 /usr/bin/python2.5 调用 python 而不仅仅是 python。

    【讨论】:

    • 非常感谢内德的回答。考虑到我在 10.6 中遇到的错误,部署 10.5 是必须的。但是 10.5 不起作用,因为 distutils 期望 10.6(如环境变量所示)。有没有办法告诉 distutils 为 10.5 工作或使用 10.5 版本?我的目标只是添加一个 python 脚本作为目标阶段,因为读写 plist 更容易,而不是部署 python 应用程序。
    • 参见上面的其他 cmets。希望有帮助!
    • 再次感谢内德。这不是 MacOSX 项目,而是 iPhone 项目,它似乎需要 10.5 作为目标,否则我会得到: ld: library not found for -lcrt1.10.6.o 即使在清理目标之后也是如此。我决定用一个完全相同的 perl 脚本来替换 python 脚本。我没有得到与 perl 相同的错误。上帝保佑 Perl!感谢 TMTOWTDI!我仍然认为python用作iPhone项目的脚本时存在问题,但我有一个解决方法。
    【解决方案3】:

    就本脚本而言,您可以简单地将 MACOSX_DEPLOYMENT_TARGET 的值临时设置为 10.6。所以你的命令是:

    env MACOSX_DEPLOYMENT_TARGET=10.6 gitversion.py
    

    【讨论】:

      【解决方案4】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-04
        • 1970-01-01
        • 2013-12-03
        • 1970-01-01
        • 2010-11-23
        • 2015-01-18
        相关资源
        最近更新 更多