PATH 中缺少“make”实用程序
此错误的原因
此错误是由setup.py 的PyNacl 源代码中的一个BUG 引起的。
但是,即使您修复它,您也会遇到更多问题,因为该源代码不打算在 Windows 上构建。
如果您只想安装PyNacl,请参阅下一节。
如果您想了解该BUG的详细信息,请参阅最后一节。
安装 PyNacl
2020 年 9 月 14 日之后,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,导致您遇到的错误)。
然后 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(...)) 来修复它。