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.
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]
$ 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.
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.
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.
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.
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