Xcode目标阶段Python脚本

问题描述:

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

我创建了一个新的目标阶段和运行的脚本中解释说:
http://yeahrightkeller.com/2008/10/19/xcode-run-script-build-phase-tip/

而且我写了解析使用

from Foundation import NSMutableDictionary 

但是该程序的Info.plist Python脚本该脚本在编译时失败并向生成结果报告以下错误:

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 Deployment目标设置为10.5。

,如果我尝试在项目的这个变量设置为10.6,然后我得到:

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

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

Apple将Python 2.5和2.6与Snow Leopard(10.6)一起发布,两者均使用10.6的部署目标构建。如果您确实需要将您的应用程序定位到10.5,则无法安全地使用Apple提供的10.6上的Pythons来部署1​​0.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。我猜测你有一个现有的10.5开发的Xcode项目,然后从10.5的Xcode导入或升级到10.6的Xcode。如果是这样,那么我认为唯一需要做的事情就是将项目窗口顶部的Active SDK从10.5更改为10.6(在总览中)。这样做并强制清理所有目标应解决crt library not found错误;如果没有,则项目依赖关系出现问题。另一方面,如果你真的需要为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。

+0

非常感谢您的回答斯内德。 部署10.5是必须的,因为我得到的错误是10.6。但10.5不工作,因为distutils期望10.6(如环境变量所示)。有没有办法告诉distutils工作在10.5还是使用10.5版本? 我的目标只是添加一个python脚本作为目标阶段,因为读取和写入plist更容易,而不是部署python应用程序。 – 2009-11-09 11:17:36

+0

查看上面的其他评论。希望有所帮助! – 2009-11-09 20:12:49

+0

再次感谢奈德。 这不是一个MacOSX项目,而是一个iPhone,它似乎需要10.5作为目标,否则我会得到:即使在清理目标之后,ld:library也找不到-lcrt1.10.6.o。 我已经决定付出艰辛的努力,用一个完全一样的perl脚本替换python脚本。 我没有得到与perl相同的错误。上帝保佑Perl!谢谢TMTOWTDI! 我仍然认为Python作为iPhone项目的脚本时存在问题,但我有一个解决方法。 – 2009-11-09 23:36:40

出于此脚本的目的,您可以暂时将MACOSX_DEPLOYMENT_TARGET的值设置为10.6。所以,你的命令是:

env MACOSX_DEPLOYMENT_TARGET=10.6 gitversion.py 

我有同样的问题,我想保持Python版本,因为通过NSMutableDictionary处理的plist大于通过Info.plist正则表达式好得多。

大厦马克桑斯的答案,解决办法是剥离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脚本代替原来的运行脚本:

env MACOSX_DEPLOYMENT_TARGET=10.6 python gitversion.py 

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

+0

[PlistBuddy](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man8/PlistBuddy.8.html)可用于读取/写入Info.plist,fyi。 – pkamb 2013-10-11 17:10:54