2009-11-09 62 views
5

我正在嘗試將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 

如何解決這個問題的任何想法?提前致謝。

回答

1

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

1

出於此腳本的目的,您可以暫時將MACOSX_DEPLOYMENT_TARGET的值設置爲10.6。所以,你的命令是:

env MACOSX_DEPLOYMENT_TARGET=10.6 gitversion.py 
2

我有同樣的問題,我想保持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

相關問題