2014-10-30 35 views
6

我想在新的OS X應用程序中使用python插件腳本。我正在尋求將一些程序邏輯卸載到python中,以便進行簡單的即時修改。我通過查看Big Nerd Ranch tutorial開始。這似乎工作,但它提出了一個鏈接Python的舊方法。看起來,自Xcode 5以來,我們應該使用this Mac Developer Library Tech Note來安裝python。然而,這個過程似乎創建了一個鏈接的python實例,而不是嵌入式的實例。我試過按照answer to this question中的指導方針,但它似乎崩潰了。如何將Python嵌入Objective-C OS X插件應用程序中?

所以我的問題是:目前的最佳做法是什麼構建python作爲Objective C Mac OS X應用程序中的插件運行時使用?如何確保它與應用程序捆綁在一起,並且可以在最終的Objective C應用程序構建之前安裝任何其他可能需要的庫?

+2

鏈接到OS X附帶的Python框架有什麼問題? – mipadi 2014-10-30 18:13:51

+0

隨OS X附帶的Python框架運行python2.7。我寧願使用python3。另外,我將如何將非標準模塊合併到插件中?不希望只安裝系統範圍的python模塊來安裝原生的Cocoa應用程序。 – 2014-11-01 11:27:38

回答

10

我想出了一種方法,似乎工作得很好。

首先,從official website下載您想要使用的python版本的源代碼。在某處解壓檔案。我正在使用Python 3.4.2。根據您使用的特定版本調整系統上的命令。

創建一個您將用於此開發python版本的構建目錄。整個目錄中應該沒有空格,以確保bash正確解釋she-bang(#!)行。我用/Users/myaccount/development/python/devbuild/python3.4.2

走進提取Python的目錄,然後運行以下命令:

./configure --prefix="/Users/myaccount/development/python/devbuild/python3.4.2" 
make 
make install 

這將在開發版本目錄中安裝蟒蛇。安裝Python路徑使用正確的目錄:

export PYTHONPATH="/Users/myaccount/development/python/devbuild/python3.4.2/lib/python3.4/site-packages/" 

進入到Python bin目錄(/Users/myaccount/development/python/devbuild/python3.4.2/bin),並使用pip3沒有安裝所需的任何模塊。 $PYTHONPATH設置將確保模塊安裝到正確的site-packages目錄中。

爲PyObjC存儲庫找到一個方便的家,並在那裏克隆它。然後簽了最新版本的標籤和安裝,確保您的$PYTHONPATH仍然是正確的:

hg clone https://bitbucket.org/ronaldoussoren/pyobjc 
cd pyobjc 
hg tags 
hg checkout [the id of the latest version from the tag list] 
/Users/myaccount/development/python/devbuild/python3.4.2/bin/python3 ./install.py 

每當你需要更新Python模塊,只需確保使用正確的蟒蛇bin和$PYTHONPATH

現在將python添加到Xcode項目。

/Users/myaccount/development/python/devbuild/python3.4.2目錄拖入Xcode項目,將其設置爲不根據需要複製項目,並創建文件夾引用。

/Users/myaccount/development/python/devbuild/python3.4.2/include/python3.4m添加到Header Search Paths設置在Xcode項目的Build Settings。不知道是否有辦法做到這一點,只是搜索我們剛剛添加的文件夾引用目錄的一般步驟。

將`/Users/myaccount/development/python/devbuild/python3.4.2/lib/libpython3.4m.a庫拖放到Xcode項目中,將其設置爲添加爲引用而不復制。

現在可以使用Big Nerd Ranch scripting tutorial repository的代碼進行一些修改。

插件管理代碼需要一個NSString擴展與wchar_t字符串Python的API似乎工作,非常喜歡:

@interface NSString (WcharEncodedString) 

- (wchar_t*) getWideString; 

@end 

@implementation NSString (WcharEncodedString) 

- (wchar_t*) getWideString { 
    const char* tmp = [self cStringUsingEncoding:NSUTF8StringEncoding]; 
    unsigned long buflen = strlen(tmp) + 1; 
    wchar_t* buffer = malloc(buflen * sizeof(wchar_t)); 
    mbstowcs(buffer, tmp, buflen); 
    return buffer; 
} 

@end 

Python的頭應該包括以下幾個方面:

#include "Python.h" 

爲了設置正確的python可執行文件PYTHONPATH和PYTHONHOME,在調用Py_Initialize()之前需要運行以下代碼,如Zorg在其他問題中所建議的那樣。

NSString* executablePath = [[NSBundle mainBundle] pathForResource:@"python3.4" ofType:nil inDirectory:@"python3.4.2/bin"]; 
Py_SetProgramName([executablePath getWideString]); 

NSString* pythonDirectory = [[NSBundle mainBundle] pathForResource:@"python3.4" ofType:nil inDirectory:@"python3.4.2/lib"]; 
Py_SetPath([pythonDirectory getWideString]); 
Py_SetPythonHome([pythonDirectory getWideString]); 

最後,蟒蛇路徑需要在PluginExecutor.py文件將擴大到包括高級別lib路徑的各個子目錄。下面的代碼添加到插件執行人文件的頂部:

import sys 
from os import walk 
path = sys.path.copy() 
for p in path: 
    for root,dirs,files in walk(p): 
     if p is not root: 
      sys.path.append(root) 

如果事情開始打破我會發布更新,但是這似乎是一個可行的解決方案現在。

+1

感謝您的詳細解釋。 +1 – 2014-12-13 21:26:58

+1

你可以更新Swift嗎? – qed 2016-12-06 14:06:13

相關問題