Pytanie Jak dołączyć bibliotekę zewnętrzną z pakietem kół python


Chcę utworzyć pakiet dla Pythona, który osadza i używa zewnętrznej biblioteki (.so) w systemie Linux za pomocą modułu cffi.

Czy istnieje standardowy sposób dołączenia pliku .so do pakietu Pythona?

Pakiet będzie używany wyłącznie wewnętrznie i nie zostanie opublikowany na platformie Pypi.

Myślę, że pakiety Wheel są najlepszą opcją - stworzyliby pakiet specyficzny dla platformy ze wszystkimi plikami gotowymi do skopiowania, więc nie będzie potrzeby budowania czegokolwiek w docelowych środowiskach.


16
2018-05-28 15:42


pochodzenie


Czy próbowałeś stworzyć koło dla posiadanej paczki? Jest duża szansa, że ​​włączy do niego potrzebny plik (ale nie jestem pewien). - Jan Vlcinsky
Próbowałem zbudować koło dla pakietu - zawierało plik .so stworzony przez cffi, który jest połączony z biblioteką zewnętrzną, ale nie z samą biblioteką zewnętrzną. - vvladymyrov
Sądzę, że zapakuję .so libs do pakietów rpm (to też pozwoli mi przekompilować je ze źródła, jeśli będzie to potrzebne) - vvladymyrov


Odpowiedzi:


Możesz użyć kierownica wstrzyknąć zewnętrzne biblioteki do koła:

naprawa repozytorium: kopiuje te zewnętrzne biblioteki współdzielone do samego koła i automatycznie modyfikuje odpowiednie wpisy RPATH, tak aby te biblioteki były pobierane w czasie wykonywania. Osiąga podobny wynik, jak gdyby biblioteki były statycznie połączone bez potrzeby wprowadzania zmian w systemie kompilacji. Paczkomaty radzą, aby łączenie w pakiety, podobnie jak łącza statyczne, mogło powodować obawy o prawa autorskie.

Możesz wstępnie zbudować zewnętrzną bibliotekę c ++, zwykle wykonując następujące czynności:

./configure && make && make install

Spowoduje to wygenerowanie my_external_library.so plik i zainstaluj go w odpowiedniej ścieżce. Musisz jednak upewnić się, że ścieżka do biblioteki jest odpowiednio ustawiona, aby moduł kontroli mógł wykryć brakującą zależność.

export LD_LIBRARY_PATH=/usr/loca/lib

Następnie można zbudować koło Pythona, wykonując:

python setup.py bdist_wheel

Wreszcie, możesz naprawić koło, które wstrzyknie my_external_library.so do paczki.

auditwheel repair my-python-wheel-1.5.2-cp35-cp35m-linux_x86_64.whl

Pomyślnie zastosowałem powyższe kroki do biblioteki Pythona confluent-kafka-python który ma wymaganą zależność c / c ++ librdkafka.


8
2018-02-08 06:20



Dzięki za podpowiedź. auditwheel pochodzi z pypa (Python Packaging Authority) - powinni wiedzieć, co robią :) - vvladymyrov


Koła są standardowym sposobem dystrybucji pakietów Pythona, ale pojawia się problem, gdy masz moduły rozszerzające, które zależą od innych so. Dzieje się tak dlatego, że używany jest normalny linker dynamiczny Linuksa, który tylko zagląda /usr/lib lub /usr/local/lib. Jest to problem podczas instalowania koła w virtualenv.

O ile mi wiadomo, masz trzy opcje:

  • Łączenie statyczne, więc "opakowanie" nie zależy od niczego innego;
  • za pomocą ctypes zawijać so bezpośrednio z Python;
  • Podziel dystrybucję na koło z kodem Pythona i opakowaniem oraz oddzielnym RPM lub DEB, aby zainstalować go w obu /usr/lib lub /usr/local/lib.

Koło może pracować, jeśli uwzględnisz osobę zależną so jako plik danych, który ma być przechowywany /lib i zainstalować w głównym środowisku Pythona (nie próbowałem tego), ale to się zepsuje, jeśli ktoś spróbuje zainstalować koło w virtualenv (spróbowałem).


5
2018-06-19 15:02