Проблемы со строительством PyNaCl

#python-3.x #pip #discord.py #pynacl

#python-3.x #pip #discord.py #pynacl

Вопрос:

Итак, я пытаюсь загрузить API discord в свой venv с помощью pip, но ему не удается собрать PyNaCl. В нем говорится, что ошибка заключается в том, что утилита ‘make’ отсутствует в PATH, но я просто добавил ее в свои переменные среды и попытался запустить ее в cmd, чтобы убедиться, что она установлена правильно. Есть идеи о том, что может быть причиной проблемы?

Я использую Windows 10, python 3.9.1 и pip 20.3.3, вот сообщение об ошибке:

Примечание: Я могу отлично установить модуль discord без голосовой поддержки, однако я хочу использовать его голосовые функции, и я не могу понять, почему он не устанавливается.

Ответ №1:

утилита ‘make’ отсутствует в PATH


Причина этой ошибки

Эта ошибка вызвана ОШИБКОЙ в setup.py PyNacl исходном коде.

Однако, даже если вы это исправите, вы столкнетесь с еще большей проблемой, поскольку этот исходный код не предназначен для сборки в Windows.

Если вы просто хотите установить PyNacl , смотрите Следующий раздел.

Если вы хотите узнать подробности об этой ОШИБКЕ, см. Последний раздел.


Установка PyNaCl

После 14 сентября 2020 года pynacl имеет предварительно встроенное колесо abi3, поэтому pip install pynacl оно будет автоматически загружено и установлено. Вам не нужно создавать pynacl самостоятельно.

  • Вы также можете вручную загрузить PyNaCl-1.4.0-cp35-abi3-win_amd64.whl и pip install PyNaCl-1.4.0-cp35-abi3-win_amd64.whl (в каталоге загрузки).
  • Если вы получаете сообщение об ошибке, вы можете использовать pip install -U pip для обновления pip и повторить попытку.
  • Если вы все еще получаете сообщение об ошибке, вы можете использовать pip debug -v для проверки совместимых тегов:
  • Если совместимые теги имеют постфикс «win_amd64», должен быть тег «cp35-abi3-win_amd64», и pip install он должен быть успешным.
  • Если совместимые теги имеют постфикс «mingw_x86_64» или «mingw_x86_64_ucrt», вы должны выполнить сборку pynacl самостоятельно (или установить win_amd64 python).

pynacl списки libsodium как зависимость. К счастью, вам не нужно строить libsodium (что требует make , вызывая ошибку, с которой вы столкнулись).

  • Вы можете загрузить предварительно собранный libsodium с https://download.libsodium.org/libsodium/releases /.
  • скачать: https://download.libsodium.org/libsodium/releases/libsodium-1.0.18-stable-mingw.tar.gz
  • разархивируйте файл .gz (вы можете использовать 7-zip или peazip) и скопируйте каталоги («bin», «lib», «include») в / libsodium-1.0.18-stable-mingw.tar/libsodium-win64 в mingw каталог установки (который также содержит «bin», «lib», «включить»)
  • наконец, используйте bash (например, git bash): SODIUM_INSTALL=system pip install pynacl .

Затем pip будет использовать PEP517 для сборки и установки pynacl для вас с помощью pre-built libsodium . Или вы можете создать его самостоятельно (загрузите исходный код из pypi и из каталога исходного кода).:

 SODIUM_INSTALL=system python setup.py bdist_wheel
 

С помощью cmd или powershell вы не можете задать переменную среды в стиле bash. Вместо этого вы можете использовать следующее:

 $env:SODIUM_INSTALL="system";pip install pynacl
 

Подробная информация об ошибке

Здесь возникает ошибка:

 if not which("make"):
    raise Exception("ERROR: The 'make' utility is missing from PATH")
 

И функция which реализована с ОШИБКОЙ:

 def which(name, flags=os.X_OK):  # Taken from twisted
    result = []
    exts = filter(None, os.environ.get('PATHEXT', '').split(os.pathsep))
    path = os.environ.get('PATH', None)
    if path is None:
        return []
    for p in os.environ.get('PATH', '').split(os.pathsep):
        p = os.path.join(p, name)
        if os.access(p, flags):
            result.append(p)
        for e in exts:
            pext = p   e
            if os.access(pext, flags):
                result.append(pext)
    return result
 

В Python3 filter возвращает итератор, а не a list (python2 filter возвращает a list ). Таким образом, «exts» будут «исчерпаны» на первой итерации. Вы можете заменить filter(...) на list(filter(...)) , чтобы исправить это.