2016-07-04 2 views
0

J'essaie d'intégrer un interpréteur Python 3 dans une application Cocoa Objective C sur un Mac, en suivant les instructions dans this answer (qui s'étend this article) et en construisant Python et PyObjC à la main . Je voudrais être en mesure d'exécuter du code Python en tant que plugins.Python 3 intégré ne crée pas de fichiers .pyc lors de l'utilisation de importlib

Je ne veux surtout pas compter sur le stock Apple Python (v2.7). J'ai la plupart de travail mais ne peut pas sembler charger de manière fiable les scripts de plugin. Il semble que l'interpréteur Python intégré ne puisse pas créer les fichiers __pycache__/*.pyc. Cela peut être un symptôme ou une cause. Si j'importe le fichier du plugin manuellement depuis le Python3 REPL (via les modules import ou imp ou importlib), le .pyc est généré et le plugin se charge correctement. Si je ne le fais pas manuellement, le .pyc n'est pas créé et je reçois un ValueError "Unmarshallable object".

J'ai essayé d'assouplir les autorisations sur le répertoire de script en vain. Le cache_tag semble OK, tant du REPL et à partir du script videur:

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

py_compile déclenche une exception Cocoa si je tente de compiler manuellement le fichier plug-in (je creuser encore en cela).

J'utilise les éléments suivants:

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

J'ai dû faire quelques ajustements nécessaires au processus décrit dans la réponse SO liée:

Compiling Python 3 nécessaires versions Homebrew de OpenSSL et zlib, et LDFLAGS et CPPFLAGS appropriés:

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

Je veillons également à ce pip est installé OK lors de la configuration Python pour construire:

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

Il y a une fourchette de la source de l'article original (qui utilise le stock Python2) qui fonctionne bien here, donc je pense que je ne suis pas trop loin de la marque. Une idée de ce que j'ai manqué? Dois-je signer ou autoriser le Python intégré? Existe-t-il des options de complétion/configuration que j'ai négligé de définir?

TIA

Répondre

0

Typique. C'est toujours la dernière chose que vous essayez, n'est-ce pas? Ajouter le répertoire contenant les scripts du plugin à sys.path semble faire l'affaire, bien que je ne sache pas pourquoi importlib a besoin de cela (je pensais que le but était de vous permettre de contourner le mécanisme d'importation normal). Peut-être que cela a à voir avec la façon dont le importlib.machinery.SourceFileLoader par défaut est implémenté?

Quelque chose comme:

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

fait le problème "objet Unmarshallable" aller loin. Le répertoire de cache et les fichiers .pyc sont créés correctement.