【问题标题】:Embedded Python 3 not creating .pyc files when using importlib使用 importlib 时嵌入式 Python 3 未创建 .pyc 文件
【发布时间】:2016-07-04 15:21:11
【问题描述】:

我正在尝试按照this answer(扩展this article)中的说明在Mac 上的Objective C Cocoa 应用程序中嵌入Python 3 解释器,并手动构建Python 和PyObjC。

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

我尝试放松对脚本目录的权限,但无济于事。无论是从 REPL 还是从保镖脚本中,cache_tag 看起来都不错:

>>> 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 需要 OpenSSL 和 zlib 的 Homebrew 版本,以及适当的 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

【问题讨论】:

    标签: objective-c pyobjc


    【解决方案1】:

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

    类似:

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

    使“不可编组对象”问题消失。缓存目录和 .pyc 文件创建正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 2015-10-31
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多