#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 при сборке образа.
Заранее благодарю.