嵌入式Python 3在使用importlib

时间:2016-07-04 15:21:12

标签: objective-c pyobjc

我试图在Mac上的Objective C Cocoa应用程序中嵌入Python 3解释器,遵循this answer(扩展this article)中的指令并手动构建Python和PyObjC。

我希望能够将Python代码作为插件运行。我特别不想依赖Apple Python(v2.7)。我有大部分工作,但似乎无法可靠地加载插件脚本。看起来嵌入式Python解释器无法创建__pycache__/*.pyc文件。这可能是一种症状或原因。如果我从Python3 REPL手动导入插件文件(通过importimpimportlib模块),则生成.pyc,然后插件正确加载。如果我不手动执行此操作,则不会创建.pyc,我会收到ValueError "Unmarshallable object"

我尝试放松对脚本目录的权限无济于事。 cache_tag在REPL和bouncer脚本中都显示正常:

>>> sys.implementation.cache_tag
'cpython-35'
如果我尝试手动编译插件文件,那么

py_compile会引发Cocoa异常(我还在深入研究)。

我使用以下内容:

  • OS X 10.11.5(El Capitan)
  • XCode 7.2.1
  • Python v3.5.2
  • PyObjC v3.11

我必须对链接的SO答案中列出的流程进行一些必要的调整:

编译Python 3需要Homebrew版本的OpenSSL和zlib,以及适当的LDFLAGS和CPPFLAGS:

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

我还确保在配置Python构建时确保pip安装正确:

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

原始文章来源(使用股票Python2)的分支工作正常here,所以我怀疑我离标记太远了。知道我错过了什么吗?我是否需要签署或以其他方式授予嵌入式Python?我是否忽略了设置的补充/配置选项?

TIA

1 个答案:

答案 0 :(得分:0)

典型。它总是你尝试的最后一件事,不是吗?将包含插件脚本的目录添加到["a", "b"]似乎可以解决问题,虽然我不确定为什么importlib需要这个(我认为重点是允许你规避正常的导入机制)。也许它与默认sys.path的实现方式有关?

类似的东西:

importlib.machinery.SourceFileLoader

制作" Unmarshallable对象"问题消失了。正确创建缓存目录和.pyc文件。