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

**

*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 для подключения к серверу Perforce. Не удалось установить 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/

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

Ответы [ 3 ]

2 голосов
/ 26 марта 2019

Я также сталкивался с такой проблемой.

Сначала я проверил 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, что слишком высоко для Perforce 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/ относится к местоположению, с которым вы хотите связать библиотеку.

0 голосов
/ 19 марта 2019

Я скачал 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-контейнер при создании образа.Заранее спасибо.

0 голосов
/ 11 марта 2019

Я также сталкиваюсь с этой проблемой - использую 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 )

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

stub.c:

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

gcc -shared -o stub.so stub.c

...