2016-07-04 68 views
0

我試圖在Mac上的Objective C Cocoa應用程序中嵌入Python 3解釋器,遵循this answer(它擴展了this article)中的指令並手動構建Python和PyObjC 。嵌入式Python 3在使用importlib時不創建.pyc文件

我希望能夠以插件的形式運行Python代碼。我特別不想依靠股票Apple Python(v2.7)。我大部分工作正常,但似乎無法可靠地加載插件腳本。它看起來像嵌入式Python解釋器無法創建__pycache__/*.pyc文件。這可能是一種症狀或原因。如果我從Python3 REPL手動導入插件文件(通過importimpimportlib模塊),會生成.pyc文件,然後正確加載插件。如果我不手動執行此操作,則不會創建.pyc,並且我會收到一個ValueError "Unmarshallable object"

我試過放鬆對腳本目錄的權限無濟於事。該cache_tag看起來不錯,無論是從REPL和保鏢腳本中:

>>> sys.implementation.cache_tag 
'cpython-35' 

py_compile引起了可可異常,如果我嘗試手動編譯插件文件(我還在挖成)。

我使用了以下內容:

  • OS X 10.11.5(酋長)
  • 的XCode 7.2.1
  • 的Python V3.5.2
  • PyObjC V3.11

我不得不做一些必要的調整,以鏈接的回答中列出的過程:

編譯Python 3個的要求自制的OpenSSL和zlib,並適當LDFLAGS的版本和CPPFLAGS:

./configure --prefix="/path/to/python/devbuild/python3.5.2" --with-ensurepip=install 

有一個叉:

export CPPFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix zlib)/include" 
export LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix zlib)/lib" 

我也保證PIP配置Python來構建時,安裝OK原始文章來源(使用股票Python2)的工作正常here,所以我懷疑我不是太離譜。任何想法,我已經錯過了?我是否需要對嵌入式Python進行簽名或授予其權限?有沒有我忽略設置的複雜/配置選項?

TIA

回答

0

典型的。它總是你最後一次嘗試,不是嗎?將包含插件腳本的目錄添加到sys.path似乎有訣竅,但我不確定爲什麼importlib需要這個(我認爲關鍵是允許您繞過正常的導入機制)。也許這與默認importlib.machinery.SourceFileLoader的實施方式有關?

喜歡的東西:

sys.path.append(os.path.abspath("/path/to/plugin/scripts")) 

使得 「Unmarshallable對象」 的問題消失。緩存目錄和.pyc文件已正確創建。