【问题标题】:PyNaCl building problemsPyNaCl 构建问题
【发布时间】:2020-12-31 06:42:37
【问题描述】:

所以我正在尝试使用 pip 将 discord 的 API 下载到我的 venv 中,但它无法构建 PyNaCl。它说错误是PATH中缺少'make'实用程序,但我只是将它添加到我的环境变量中并尝试在cmd上运行它以确保它已正确安装。关于可能导致问题的任何想法?

我正在运行 Windows 10、python 3.9.1 和 pip 20.3.3 Here is the error message:

注意:我可以完美地安装不支持语音的 discord 模块,但是,我想使用它的语音功能,我不明白为什么它无法安装。

【问题讨论】:

    标签: python-3.x pip discord.py pynacl


    【解决方案1】:

    PATH 中缺少“make”实用程序


    此错误的原因

    此错误是由setup.pyPyNacl 源代码中的一个BUG 引起的。

    但是,即使您修复它,您也会遇到更多问题,因为该源代码不打算在 Windows 上构建。

    如果您只想安装PyNacl,请参阅下一节。

    如果您想了解该BUG的详细信息,请参阅最后一节。


    安装 PyNacl

    2020 年 9 月 14 日之后,pynacl 有 abi3 预置轮,所以pip install pynacl 会自动下载并安装它。你不需要自己构建pynacl

    • 您也可以手动下载 PyNaCl-1.4.0-cp35-abi3-win_amd64.whlpip 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)。

    pynacllibsodium 列为依赖项。幸运的是,您不需要构建libsodium(它需要make,导致您遇到的错误)。

    然后 pip 将使用 PEP517 为您构建和安装 pynacl 以及预构建的 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是用一个BUG实现的:

    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 返回一个迭代器,而不是 list(python2 的 filter 返回一个 list)。因此,“exts”将在第一次迭代中“耗尽”。您可以将filter(...) 替换为list(filter(...)) 来修复它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 2021-06-24
      • 2016-10-09
      • 2010-09-20
      • 2014-07-15
      • 2012-06-02
      相关资源
      最近更新 更多