我试图在Mac上的Objective C Cocoa应用程序中嵌入Python 3解释器,遵循this answer(扩展this article)中的指令并手动构建Python和PyObjC。
我希望能够将Python代码作为插件运行。我特别不想依赖Apple Python(v2.7)。我有大部分工作,但似乎无法可靠地加载插件脚本。看起来嵌入式Python解释器无法创建__pycache__/*.pyc
文件。这可能是一种症状或原因。如果我从Python3 REPL手动导入插件文件(通过import
或imp
或importlib
模块),则生成.pyc,然后插件正确加载。如果我不手动执行此操作,则不会创建.pyc,我会收到ValueError "Unmarshallable object"
。
我尝试放松对脚本目录的权限无济于事。 cache_tag在REPL和bouncer脚本中都显示正常:
>>> sys.implementation.cache_tag
'cpython-35'
如果我尝试手动编译插件文件,那么 py_compile
会引发Cocoa异常(我还在深入研究)。
我使用以下内容:
我必须对链接的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
答案 0 :(得分:0)
典型。它总是你尝试的最后一件事,不是吗?将包含插件脚本的目录添加到["a", "b"]
似乎可以解决问题,虽然我不确定为什么importlib需要这个(我认为重点是允许你规避正常的导入机制)。也许它与默认sys.path
的实现方式有关?
类似的东西:
importlib.machinery.SourceFileLoader
制作" Unmarshallable对象"问题消失了。正确创建缓存目录和.pyc文件。