嵌入式 Python 3 使用 importlib 时不创建 .pyc 文件

Embedded Python 3 not creating .pyc files when using importlib

我正在尝试在 Mac 上的 Objective C Cocoa 应用程序中嵌入 Python 3 解释器,遵循 this answer (which extends 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 异常(我仍在深入研究)。

我正在使用以下内容:

我不得不对链接的 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 签名或以其他方式授予许可?是否有 complilation/configuration 个选项是我忘记设置的?

TIA

典型。这总是你尝试的最后一件事,不是吗?将包含插件脚本的目录添加到 sys.path 似乎可以解决问题,尽管我不确定为什么 importlib 需要这个(我认为重点是让您绕过正常的导入机制)。也许这与默认 importlib.machinery.SourceFileLoader 的实现方式有关?

类似于:

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

使 "Unmarshallable object" 问题消失。缓存目录和.pyc文件创建正确。