Xcode目标阶段Python脚本

5

我试图将一个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(也就是我正在使用的Snow Leopard),但该项目的MacOSX部署目标设置为10.5。

如果我尝试将此变量设置为项目中的10.6,则会出现以下错误:

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

有什么解决这个问题的想法吗?提前感谢。
4个回答

2

我有同样的问题,我希望保留Python版本,因为通过NSMutableDictionary处理plist比在Info.plist上使用正则表达式更好。

在Maxence的答案基础上,解决方案是将Python代码从“Run Script”构建阶段中剥离出来,放入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脚本替换原来的运行脚本:

env MACOSX_DEPLOYMENT_TARGET=10.6 python gitversion.py

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


PlistBuddy 可以用于读写 Info.plist,供您参考。 - pkamb

1

为了这个脚本的目的,您可以暂时将MACOSX_DEPLOYMENT_TARGET的值设置为10.6。因此,您的命令将是:

env MACOSX_DEPLOYMENT_TARGET=10.6 gitversion.py

1

苹果公司在Snow Leopard(10.6)中分发Python 2.5和2.6,并且两者都使用10.6的部署目标构建。如果您确实需要将应用程序针对10.5进行定位,则不能安全地在10.6上使用由苹果提供的Python来部署10.5。

最简单的解决方案可能是从python.org下载并安装Python 2.6。该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。只需这样做并强制执行“清除所有目标”应该可以解决错误;如果不能,则说明项目依赖关系存在问题。

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


非常感谢您的回答,Ned。 由于我在10.6上遇到了错误,因此部署到10.5是必须的。但是,由于distutils期望10.6(如环境变量所示),因此10.5无法正常工作。是否有一种方法可以告诉distutils为10.5工作或使用10.5版本?对我来说,目标只是将Python脚本添加为目标阶段,因为读写plist更容易,而不是部署Python应用程序。 - Jorge Ortiz
请参考上面的附加评论。希望这有所帮助! - Ned Deily
再次感谢你,Ned。 这不是一个MacOSX项目,而是一个iPhone项目,似乎需要10.5作为目标,否则我会得到:ld:找不到库-lcrt1.10.6.o,即使清理了目标也是如此。 我决定走强制路线,用一个完全相同的perl脚本替换python脚本。 我用perl没有遇到同样的错误。上帝保佑Perl!感谢TMTOWTDI! 我仍然认为,在iPhone项目的脚本中使用Python存在问题,但我已经有了解决方法。 - Jorge Ortiz


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接