Версия libcurl, установленная по ссылке (7.76.1), старше версии, установленной при компиляции (7.86.0)
Когда я запускаю celery worker в моем проекте django, он не запускается со следующей ошибкой:
"Неустранимая ошибка: ImportError('Клиенту curl требуется библиотека pycurl.')
Я просмотрел все вопросы на github и вопросы, размещенные на stackoverflow, но не смог определить эту проблему. Моя установка pycurl прошла успешно, и если я запускаю python -c 'import pycurl' && echo "Success"
. Он возвращает мне успех, но когда я запускаю celery worker, он по-прежнему выдает ошибку pycurl.
Я ожидал успешного запуска celery, но в ответ получил ошибку импорта.
Если я перехожу к пакету kombu, который установлен, и пытаюсь вывести значение traceback, то он выводит:
pycurl: версия libcurl link-time (7.76.1) старше версии compile-time (7.86.0)
brew info openssl выводит следующее:
openssl@3 is keg-only, which means it was not symlinked into /usr/local,
because macOS provides LibreSSL.
If you need to have openssl@3 first in your PATH, run:
echo 'export PATH="/usr/local/opt/openssl@3/bin:$PATH"' >> /Users/<>/.bash_profile
For compilers to find openssl@3 you may need to set:
export LDFLAGS="-L/usr/local/opt/openssl@3/lib"
export CPPFLAGS="-I/usr/local/opt/openssl@3/include"
For pkg-config to find openssl@3 you may need to set:
export PKG_CONFIG_PATH="/usr/local/opt/openssl@3/lib/pkgconfig"
вывод curl info brew выглядит следующим образом:
curl is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.
If you need to have curl first in your PATH, run:
echo 'export PATH="/usr/local/opt/curl/bin:$PATH"' >> /Users/<>/.bash_profile
For compilers to find curl you may need to set:
export LDFLAGS="-L/usr/local/opt/curl/lib"
export CPPFLAGS="-I/usr/local/opt/curl/include"
For pkg-config to find curl you may need to set:
export PKG_CONFIG_PATH="/usr/local/opt/curl/lib/pkgconfig"
Я столкнулся с этой проблемой на Mac Pro (intel) под управлением Ventura 13.0. Судя по количеству сообщений на SO и других сайтах, у многих других были неоднозначные результаты по устранению этой проблемы. У меня все получилось, но у вас может быть по-разному.
Такой подход обеспечивает соответствие версии pycurl версии curl для macOS. Другие подходы пытаются установить curl из homebrew и ссылаться на него. Подход homebrew, похоже, работает для python, но Django и celery всегда ссылаются на встроенный curl.
Проблема
➜ ~ pip install pycurl
Collecting pycurl
Using cached pycurl-7.45.2-cp310-cp310-macosx_13_0_x86_64.whl
Installing collected packages: pycurl
Successfully installed pycurl-7.45.2
➜ ~ python
Python 3.10.11 (main, Apr 7 2023, 07:31:31) [Clang 14.0.0 (clang-1400.0.29.202)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pycurl
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: pycurl: libcurl link-time version (7.84.0) is older than compile-time version (7.87.0)
Обратите внимание на версию времени ссылки libcurl link-time version (7.84.0)
. Ваша может отличаться.
Решение
Сборка pycurl из того же исходного кода, что и установленная версия.
# Remove installed pycurl version
pip uninstall -y pycurl
# Remove homebrew curl
brew uninstall curl
# Use the same version of curl as the error message
export CURL_VERSION=7.84.0
# Install openssl for pycurl compiling
brew install openssl || brew update openssl
# Downloading sources
curl --silent "https://curl.se/download/curl-${CURL_VERSION}.tar.bz2" > "curl-${CURL_VERSION}.tar.bz2"
tar -xf "curl-${CURL_VERSION}.tar.bz2"
# Explicitly indicate openssl
export PYCURL_SSL_LIBRARY=openssl
# Setting up compiler flags and PATH
export PATH="$(pwd)/curl-${CURL_VERSION}/bin:$PATH"
export LDFLAGS="-L$(pwd)/curl-${CURL_VERSION}/lib -L/usr/local/opt/openssl@3/lib"
export CPPFLAGS="-I$(pwd)/curl-${CURL_VERSION}/include -I/usr/local/opt/openssl@3/include"
# Installing
pip install --no-cache-dir --compile pycurl
# Checking up
python -c 'import pycurl' && echo 'Success!'
Вы можете найти несколько замечательных бесед по этому вопросу здесь: https://gist.github.com/vidakDK/de86d751751b355ed3b26d69ecdbdb99