所以我试图用 pip 将不和谐的 API 下载到我的 venv 中,但它无法构建 PyNaCl。它说错误是PATH中缺少'make'实用程序,但我只是将它添加到我的环境变量中并尝试在cmd上运行它以确保它已正确安装。关于可能导致问题的任何想法?
我正在运行 Windows 10、python 3.9.1 和 pip 20.3.3 以下是错误消息:
注意:我可以完美地安装不支持语音的 discord 模块,但是,我想利用它的语音功能,我不明白为什么它无法安装。
所以我试图用 pip 将不和谐的 API 下载到我的 venv 中,但它无法构建 PyNaCl。它说错误是PATH中缺少'make'实用程序,但我只是将它添加到我的环境变量中并尝试在cmd上运行它以确保它已正确安装。关于可能导致问题的任何想法?
我正在运行 Windows 10、python 3.9.1 和 pip 20.3.3 以下是错误消息:
注意:我可以完美地安装不支持语音的 discord 模块,但是,我想利用它的语音功能,我不明白为什么它无法安装。
PATH 中缺少“make”实用程序
此错误的原因
这个错误是由源代码中的一个BUG引起的。setup.py
PyNacl
但是,即使您修复它,您也会遇到更多问题,因为该源代码不打算在 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
,导致您遇到的错误)。
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)并将 /libsodium-1.0.18-stable-mingw.tar/libsodium-win64 中的目录(“bin”、“lib”、“include”)复制到您的mingw
安装中目录(其中还包含“bin”、“lib”、“include”)
最后,使用 bash(如 git bash):SODIUM_INSTALL=system pip install pynacl
.
然后 pip 将使用 PEP517pynacl
为您构建和安装 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
是通过一个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
返回一个迭代器,而不是 a list
(python2 的filter
返回 a list
)。因此,“exts”将在第一次迭代中“耗尽”。您可以替换filter(...)
为list(filter(...))
来修复它。