2016-07-04 4 views
0

Я пытаюсь внедрить интерпретатор Python 3 в приложение Objective C Cocoa на Mac, следуя инструкциям в this answer (который расширяет this article) и строит Python и PyObjC вручную ,Embedded Python 3 не создает файлы .pyc при использовании importlib

Я хотел бы иметь возможность запускать код Python в качестве плагинов. Я специально не хочу полагаться на акции Apple Python (v2.7). Я больше всего работаю, но не могу надежно загрузить скрипты плагинов. Похоже, что встроенный интерпретатор Python не может создать файлы __pycache__/*.pyc. Это может быть признаком или причиной. Если я импортирую файл плагина вручную из Python3 REPL (через import или imp или importlib), будет создан .pyc, и плагин затем загрузится правильно. Если я не сделаю это вручную, .pyc не будет создан, и я получу ValueError "Unmarshallable object".

Я пробовал разрешать разрешения в каталоге сценариев безрезультатно. Cache_tag выглядит хорошо, как с РЕПЛ и из сценария вышибала:

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

py_compile вызывает исключение какао, если я пытаюсь скомпилировать файл плагина вручную (я все еще копаться в этом).

Я использую следующее:

  • 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 для создания:

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

Существует вилка исходного источника статьи (который использует запас Python2), который отлично работает here, поэтому я подозреваю, что не слишком далеко от знака. Любая идея, что я пропустил? Мне нужно подписать или иным образом разрешить встроенный Python? Есть ли варианты настройки/конфигурации, которые я забыл установить?

TIA

ответ

0

Типичный. Это всегда последнее, что вы пытаетесь, не так ли? Добавление каталога, содержащего сценарии плагина, к sys.path, похоже, делает трюк, хотя я не уверен, почему importlib это нуждается (я думал, что нужно было обойти нормальный механизм импорта). Возможно, это связано с тем, как реализован по умолчанию importlib.machinery.SourceFileLoader?

Что-то вроде:

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

делает проблему "Unmarshallable объект" уйти. Файлы кеша и .pyc-файлы создаются правильно.

Смежные вопросы