Comment utiliser Ruby's PyCall pour activer Pyenv Python

Environnement supposé

Les problèmes rencontrés

Écrivez un script Ruby comme celui-ci [^ 1]

test.rb


require 'pycall/import'

puts "ok"

Une fois exécuté,

$ ruby test.rb
ImportError: No module named site

J'obtiens l'erreur.

Solution

Lors de l'installation de Python avec pyenv, spécifiez une option pour créer une bibliothèque partagée.

$ CONFIGURE_OPTS="--enable-shared" pyenv install 3.6.1

Cela générera libpython3.6m.dylib sous ~ / .pyenv / versions / 3.6.1. [^ 2]

suivi

Trouvez le module du site

$ cd $(pyenv prefix)
$ find . -name site.py
./lib/python3.6/site-packages/jedi/evaluate/site.py
./lib/python3.6/site.py

Il y a site.py. Je suppose que c'est juste que le chemin ne passe pas.

Essayez avec PYTHONPATH

PYTHONPATH=$HOME/.pyenv/versions/3.6.1/lib/python3.6 ruby test.rb
  File "/Users/cesare/.pyenv/versions/3.6.1/lib/python3.6/site.py", line 177
    file=sys.stderr)
        ^
SyntaxError: invalid syntax

Le module a été trouvé avec succès, mais cette fois j'ai eu une erreur de syntaxe. Apparemment, je soupçonne que le système de traitement qui a chargé ce module n'est pas le système Python3.x.

J'ai regardé légèrement la source de PyCall et j'ai semblé utiliser FFI, donc je m'attendais à ce que le système de traitement soit probablement une bibliothèque partagée.

Rechercher une bibliothèque partagée pour le traitement

Sur Mac, l'extension des bibliothèques partagées est souvent .dylib, alors cherchons-la comme ceci.

$ find . -name '*.dylib'
./lib/python3.6/site-packages/matplotlib/.dylibs/libpng16.16.dylib
./lib/python3.6/site-packages/matplotlib/.dylibs/libz.1.2.10.dylib
./lib/python3.6/site-packages/scipy/.dylibs/libgcc_s.1.dylib
./lib/python3.6/site-packages/scipy/.dylibs/libgfortran.3.dylib
./lib/python3.6/site-packages/scipy/.dylibs/libquadmath.0.dylib

Certains sont sortis, mais ils sont différents car ils proviennent de packages installés plus tard. Si vous regardez sous .pyenv / versions / 3.6.1 / lib, vous pouvez voir que le fichier libpython3.6m.a roule, mais .a n'est pas une bibliothèque partagée et ce que vous recherchez n'est pas cela. Je suppose qu'il est probablement nécessaire qu'un fichier appelé libpython3.6m.dylib existe.

Autoriser pyenv à créer une bibliothèque partagée pour le traitement

Quand j'ai récupéré la source du système de traitement Python et examiné l'option de configure, j'ai trouvé qu'il semble que --enable-shared puisse être spécifié. Il semble que vous puissiez utiliser la variable d'environnement CONFIGURE_OPTS pour spécifier l'option de configure lors de l'installation de pyenv.

Alors

$ CONFIGURE_OPTS="--enable-shared" pyenv install 3.6.1

Cela a généré libpython3.6m.dylib. Lorsque je réexécute le script de test Ruby,

$ ruby test.rb
ok

Cela a fonctionné en toute sécurité.

Supplément

ordre de recherche de libpython

Vous pouvez observer comment PyCall recherche libpython en utilisant la variable d'environnement DEBUG_FIND_LIBPYTHON.

$ DEBUG_FIND_LIBPYTHON=1 ruby -e 'require "pycall"'

Ce faisant, les chemins recherchés seront répertoriés dans la sortie standard.


[^ 1]: J'ai obtenu ce code après avoir supprimé des éléments supplémentaires pour trouver la cause de l'erreur. Puisque "ok" n'apparaît pas dans la sortie standard, on peut voir qu'il s'agit de mousse avec "require'pycall / import". [^ 2]: Lorsque --enable-shared n'était pas spécifié, .dylib n'était pas généré et seul le fichier .a portant le même nom était placé.

Recommended Posts

Comment utiliser Ruby's PyCall pour activer Pyenv Python
Comment utiliser Pyenv
Pour utiliser python, mettez pyenv sur macOS avec PyCall
Comment utiliser tkinter avec python dans pyenv
python3: Comment utiliser la bouteille (2)
Comment utiliser Python Argparse
[Python] Comment utiliser checkio
[Python] Comment utiliser input ()
Comment utiliser Python lambda
[Python] Comment utiliser virtualenv
python3: Comment utiliser la bouteille (3)
python3: Comment utiliser la bouteille
Comment utiliser les octets Python
[Python] Comment utiliser la série Pandas
Comment utiliser les requêtes (bibliothèque Python)
Comment utiliser SQLite en Python
[Python] Comment utiliser la liste 3 Ajouté
Comment utiliser Mysql avec python
Comment utiliser l'API Python d'OpenPose
Comment utiliser ChemSpider en Python
Python: Comment utiliser pydub (lecture)
Comment utiliser PubChem avec Python
Comment utiliser la fonction zip de python
[Python] Comment utiliser l'API Typetalk
[Python] Résumé de l'utilisation des pandas
[Introduction à Python] Comment utiliser la classe en Python?
Comment installer et utiliser pandas_datareader [Python]
[python] Comment utiliser __command__, explication des fonctions
[Python] Comment utiliser import sys sys.argv
[Python] Organisation de l'utilisation des instructions
Mémorandum sur l'utilisation du python gremlin
[Python2.7] Résumé de l'utilisation d'unittest
Comment utiliser __slots__ dans la classe Python
Comment utiliser "deque" pour les données Python
[Python] Comprendre comment utiliser les fonctions récursives
Résumé de l'utilisation de la liste Python
Comment utiliser les expressions régulières en Python
[Python2.7] Résumé de l'utilisation du sous-processus
Comment utiliser is et == en Python
[Question] Comment utiliser plot_surface de python
Comment utiliser xml.etree.ElementTree
Comment utiliser Python-shell
Comment utiliser la bibliothèque C en Python
Remarques sur l'utilisation de tf.data
Comment utiliser virtualenv
Comment utiliser Seaboan
Comment utiliser la correspondance d'image
Comment utiliser le shogun
[Introduction à l'application Udemy Python3 +] 23. Comment utiliser Tapuru
Comment installer Python
Comment utiliser Virtualenv
Comment utiliser numpy.vectorize
Comment utiliser Raspeye Pie Camera Python
Comment utiliser pytest_report_header
Comment utiliser la bibliothèque d'images Python dans la série python3
Comment utiliser Python Kivy ④ ~ Exécution sur Android ~
Comment utiliser partiel
Comment utiliser Bio.Phylo
Résumé de l'utilisation de MNIST avec Python