Verwendung von Ruby's PyCall zum Aktivieren von pyenv Python

Angenommene Umgebung

Probleme aufgetreten

Schreiben Sie ein Ruby-Skript wie dieses [^ 1]

test.rb


require 'pycall/import'

puts "ok"

Einmal ausgeführt,

$ ruby test.rb
ImportError: No module named site

Ich bekomme den Fehler.

Lösungen

Geben Sie bei der Installation von Python mit pyenv eine Option zum Erstellen einer gemeinsam genutzten Bibliothek an.

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

Dadurch wird libpython3.6m.dylib unter ~ / .pyenv / version / 3.6.1 generiert. [^ 2]

Verfolgung

Suchen Sie das Site-Modul

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

Es gibt site.py. Ich denke, es ist nur so, dass der Weg nicht verläuft.

Versuchen Sie es durch 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

Das Modul wurde erfolgreich gefunden, aber diesmal habe ich einen Syntaxfehler erhalten. Anscheinend vermute ich, dass das Verarbeitungssystem, das dieses Modul geladen hat, kein Python3.x-System ist.

Ich schaute leicht auf die Quelle von PyCall und schien FFI zu verwenden, daher erwartete ich, dass das Verarbeitungssystem wahrscheinlich eine gemeinsam genutzte Bibliothek war.

Suchen Sie eine gemeinsam genutzte Bibliothek zur Verarbeitung

Auf Macs lautet die Erweiterung für gemeinsam genutzte Bibliotheken häufig .dylib. Suchen wir also wie folgt danach.

$ 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

Einige sind herausgekommen, aber sie unterscheiden sich, weil sie von später installierten Paketen stammen. Wenn Sie unter .pyenv / version / 3.6.1 / lib nachsehen, können Sie sehen, dass die Datei libpython3.6m.a rollt, aber .a keine gemeinsam genutzte Bibliothek ist und was Sie suchen, ist dies nicht. Ich denke, es ist wahrscheinlich notwendig, dass eine Datei namens libpython3.6m.dylib existiert.

Erlauben Sie pyenv, eine gemeinsam genutzte Bibliothek zur Verarbeitung zu erstellen

Als ich die Quelle des Python-Verarbeitungssystems abrief und die Option "configure" untersuchte, stellte ich fest, dass anscheinend "--enable-shared" angegeben werden kann. Es scheint, dass Sie die Umgebungsvariable "CONFIGURE_OPTS" verwenden können, um die Option "configure" bei der Installation von pyenv anzugeben.

Damit

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

Dies erzeugte libpython3.6m.dylib. Wenn ich das Test-Ruby-Skript erneut ausführe,

$ ruby test.rb
ok

Es hat sicher funktioniert.

Ergänzung

libpython Suchreihenfolge

Sie können beobachten, wie PyCall nach libpython sucht, indem Sie die Umgebungsvariable "DEBUG_FIND_LIBPYTHON" verwenden.

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

Auf diese Weise werden die gesuchten Pfade in der Standardausgabe aufgelistet.


[^ 1]: Ich habe diesen Code erhalten, nachdem ich zusätzliche Dinge gekürzt habe, um die Fehlerursache zu finden. Da "ok" nicht in der Standardausgabe erscheint, ist zu sehen, dass es sich um Moos mit "require'pycall / import" handelt. [^ 2]: Wenn "--enable-shared" nicht angegeben wurde, wurde .dylib nicht generiert und nur die .a-Datei mit demselben Namen wurde platziert.

Recommended Posts

Verwendung von Ruby's PyCall zum Aktivieren von pyenv Python
Wie benutzt man Pyenv?
So verwenden Sie Python in Pyenv unter MacOS mit PyCall
Wie man tkinter mit Python in Pyenv benutzt
python3: Verwendung der Flasche (2)
Wie benutzt man Python Argparse?
[Python] Verwendung von checkio
[Python] Verwendung von input ()
Wie benutzt man Python Lambda?
[Python] Verwendung von virtualenv
python3: Verwendung der Flasche (3)
python3: Wie man eine Flasche benutzt
Verwendung von Python-Bytes
[Python] Verwendung der Pandas-Serie
Verwendung von Anfragen (Python Library)
Verwendung von SQLite in Python
[Python] Verwendung von Liste 3 Hinzugefügt
Wie man MySQL mit Python benutzt
Verwendung der Python-API von OpenPose
Verwendung von ChemSpider in Python
Python: Verwendung von pydub (Wiedergabe)
Verwendung von PubChem mit Python
Verwendung der Zip-Funktion von Python
[Python] Verwendung der Typetalk-API
[Python] Zusammenfassung der Verwendung von Pandas
[Einführung in Python] Wie verwende ich eine Klasse in Python?
So installieren und verwenden Sie pandas_datareader [Python]
[Python] Verwendung von __command__, Funktionserklärung
[Python] Verwendung von import sys sys.argv
[Python] Organisieren der Verwendung für Anweisungen
Memorandum über die Verwendung von Gremlin Python
[Python2.7] Zusammenfassung der Verwendung von unittest
Verwendung von __slots__ in der Python-Klasse
Verwendung von "deque" für Python-Daten
[Python] Verstehen, wie rekursive Funktionen verwendet werden
Zusammenfassung der Verwendung der Python-Liste
Verwendung regulärer Ausdrücke in Python
[Python2.7] Zusammenfassung der Verwendung des Unterprozesses
Verwendung ist und == in Python
[Frage] Wie verwende ich plot_surface von Python?
Verwendung von xml.etree.ElementTree
Wie benutzt man Python-Shell
Verwendung der C-Bibliothek in Python
Hinweise zur Verwendung von tf.data
Verwendung von virtualenv
Wie benutzt man Seaboan?
Verwendung von Image-Match
Wie man Shogun benutzt
[Einführung in die Udemy Python3 + -Anwendung] 23. Verwendung von Tapuru
So installieren Sie Python
Verwendung von Virtualenv
Verwendung von numpy.vectorize
Verwendung von Raspeye Pie Camera Python
Verwendung von pytest_report_header
Verwendung der Python-Bildbibliothek in der Python3-Serie
Verwendung von Python Kivy ④ ~ Ausführung unter Android ~
Wie man teilweise verwendet
Wie man Bio.Phylo benutzt
Zusammenfassung der Verwendung von MNIST mit Python