Импортер: /usr/local/lib/python3.7/site-packages/P4API.cpython-37m-x86_64-linux-gnu.so: неопределенный символ: SSL_library_init

#linux #docker #perforce #p4python

#linux #docker #волей — неволей #p4python

Вопрос:

**

 *File "/usr/local/lib/python3.7/site-packages/P4.py", line 410, in <module>
    import P4API   
ImportError: /usr/local/lib/python3.7/site-packages/P4API.cpython-37m-x86_64-linux-gnu.so: undefined symbol: SSL_library_init*
  

**

Я получаю вышеуказанную ошибку при запуске контейнера docker и установке p4python для принудительного подключения к серверу. При установке p4python в образах Debian произошел сбой. Итак, я попробовал CentOS сейчас. В журнале указано, что пакет установлен. У меня была эта проблема некоторое время, но я решил ее в Windows, найдя правильную версию P4API.cpp подключаем к Сети и размещаем его вручную.

В журнале при установке p4python во время сборки docker написано:

 *Building wheels for collected packages: p4python, SQLAlchemy, pycparser
  Building wheel for p4python (setup.py): started
  Building wheel for p4python (setup.py): finished with status 'done'*
  

На форумах perforce недавно был вопрос по этому поводу, но решения не было.
https://forums.perforce.com/index.php?/topic/5933-p4python-undefined-symbol-ssl-library-init /

есть предложения о том, как решить эту проблему?

Ответ №1:

Я также столкнулся с подобной проблемой.

Сначала я проверил libssl.so версию, которая использовалась P4API:

ldd /home/someuser/.local/lib/python3.5/site-packages/P4API.cpython-35m-x86_64-linux-gnu.so

Я понял, что P4API указывает на libssl.so.1.1 , который слишком высок для принудительного API. Как указано в документации по совместимости с OpenSSL, вы можете использовать максимум 1.0.2k .

Я установил libssl 1.0.2 на Debian 9 с помощью:

sudo apt-get install libssl1.0.2

и указал на эту версию, связав для новой установки:

 ln -s /usr/lib/x86_64-linux-gnu/libssl.so.1.0.2 /some/path/libssl.so
pip3 uninstall p4python
pip3 install --install-option="--ssl" --install-option="/some/path/" p4python
  

Где /some/path/ относится к местоположению, к которому вы хотите привязать библиотеку.

Комментарии:

1. @jpyams Я m sorry, I made mistake, there should be /some/path/` только в install-option параметре; /some/path/ ссылаюсь на любое местоположение, когда вы хотите иметь определение ссылки

Ответ №2:

Я тоже сталкиваюсь с этой проблемой — использую Python 2.7 x86_64 в Debian Buster.

TL; DR Предварительная загрузка заглушки для заполнения недостающих символов является возможным обходным решением (работает для меня!):

LD_PRELOAD=~/stub.so python -c "import P4"

Я скомпилировал его сам, вы можете получить его из https://www.dropbox.com/s/j9bongx094dwf6u/stub.so?dl=0

Длинное объяснение:

Это происходит потому, что в libssl в более новых дистрибутивах отсутствуют некоторые символы из более старых версий libssl, и двоичные файлы, предоставляемые Perforce, все еще ссылаются на них (в частности, netssltransport.o в librpc.a из ftp://ftp.perforce.com/perforce/r18.2/bin.linux26x86_64/p4api-glibc2.12.tgz )

Я не думаю, что эти символы необходимы, поэтому вы можете просто заглушить их:

заглушка.c:

 void SSLv23_method() {};
void SSLeay() {};
void SSL_load_error_strings() {};
  

gcc -shared -o stub.so stub.c

Комментарии:

1. Можете ли вы помочь мне с порядком команд, которые я должен использовать? я могу использовать его в качестве ссылки. Заранее спасибо 🙂

2. Я нашел способ обойти эту ошибку. Не уверен, что это лучший и простой способ сделать это, но он сработал. Упомянем об этом ниже.

Ответ №3:

Я загружаю p4python и извлекаю с помощью «tar xzf p4python.tgz».

Я думаю, что пакет не нашел правильное расположение файлов библиотеки ssl, я полагаю. Итак, это включено в файл Dockerfile.

 RUN ln -nfs /usr/lib/x86_64-linux-gnu/libssl.so.1.0.2 /usr/lib/x86_64-linux-gnu/libssl.so
  

Ошибка была устранена.
В связи с этим, какой самый простой способ установить клиент p4 в контейнер docker при сборке образа.
Заранее благодарю.