在 Windows 10 上安装 PyAudio 错误
我想安装 PyAudio
我有Windows 10、Python 3.7、pip 8.1
我正在使用命令 pip install PyAudio
在命令提示符中安装它
但有一个错误错误:命令'D:\\VisualStudio2017\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\cl.exe'失败,退出状态2
Command "c:\python37\python.exe -u -c "import setuptools, tokenize;__file__='C:\\Users\\USER\\AppData\\Local\\Temp\\pip-install-is1aobj6\\pyaudio\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record C:\Users\USER\AppData\Local\Temp\pip-record-50bh4kz0\install-record.txt --single-version-externally-managed --compile" failed with error code 1 in C:\Users\USER\AppData\Local\Temp\pip-install-is1aobj6\pyaudio\
这是一个 screenshot
感谢您阅读我的问题。我希望你能帮忙:D
最佳答案
嗯,当我想安装 pylisten (它有 PyAudio 作为依赖项)时,我遇到了这个问题。
这里有两个问题 - 首先,你的 MSVC 找不到 portaudio.h,然后构建时 min
宏会出现问题。但首先要做的事情。
获取portaudio
这是 PyAudio 的 C 依赖项,因此您需要包含文件,特别是 portaudio.h
,如屏幕截图中所示。可以获取适用于 Windows 的二进制文件,但如果您使用 Anaconda,最简单的方法是使用 conda
安装它:
(base) C:\> conda search portaudio
Loading channels: done
# Name Version Build Channel
portaudio 19.6.0 h0c8e037_3 pkgs/main
portaudio 19.6.0 hfa6e2cd_3 pkgs/main
(base) C:\> conda install portaudio
(...)
接下来,我们想知道 portaudio 库中的文件实际去了哪里。没有 conda package --list
命令...(请参见此处: https://github.com/conda/conda/pull/7457 ),因此我们需要在其他地方找到一些魔法:
(base) C:\>dir %CONDA_PREFIX%\conda-meta\portaudio*
(...)
26.01.2020 13:17 5 577 portaudio-19.6.0-hfa6e2cd_3.json
我们需要检查此 JSON 并找到 files
属性:
"extracted_package_dir": "C:\\Users\\(...)\\Anaconda3\\pkgs\\portaudio-19.6.0-hfa6e2cd_3",
"features": "",
"files": [
"Library/bin/portaudio.dll",
"Library/include/pa_asio.h",
"Library/include/pa_jack.h",
"Library/include/pa_linux_alsa.h",
"Library/include/pa_mac_core.h",
"Library/include/pa_win_ds.h",
"Library/include/pa_win_wasapi.h",
"Library/include/pa_win_waveformat.h",
"Library/include/pa_win_wdmks.h",
"Library/include/pa_win_wmme.h",
"Library/include/portaudio.h",
"Library/lib/portaudio.lib",
"Library/lib/portaudio_static.lib",
".nonadmin"
],
extracted_package_dir
(上面删除的用户名)实际上相当于:
%CONDA_PREFIX%\pkgs\portaudio-19.6.0-hfa6e2cd_3
。
因此,对于这个特定的构建,必要的包含目录(-I
)是:
%CONDA_PREFIX%\pkgs\portaudio-19.6.0-hfa6e2cd_3\Library\include
链接目录(-L
)是:
%CONDA_PREFIX%\pkgs\portaudio-19.6.0-hfa6e2cd_3\Library\lib
这在下面会有用。
简单的方法,但行不通
现在,如果您的 Conda 环境具有用于构建 native 扩展的 MSVC 14.0,您应该可以使用:
(base) C:\> pip install --global-option=build_ext --global-option="-I%CONDA_PREFIX%\pkgs\portaudio-19.6.0-hfa6e2cd_3\Library\include" --global-option="-L%CONDA_PREFIX%\pkgs\portaudio-19.6.0-hfa6e2cd_3\Library\lib" pyaudio
现在,它将找到portaudio.h
!
但是遗憾的是,在撰写本文时,此操作因编译错误而失败。我仍然把它放在这里,因为也许与 MSVC 的不兼容问题会得到修复。
艰难但成功的方法
我们需要破解 PyAudio 的源代码。这可以像这样完成:
(base) C:\>pip download pyaudio
这将下载一个类似 PyAudio-0.2.11.tar.gz
的文件(版本号将来可能会有所不同)。您需要使用 tar
解压它。我把它放在 C:\Windows\system32
中 - 也许是因为 WSL。您也可以使用 7-zip 来解压它。无论如何:
(base) C:\>tar xf PyAudio-0.2.11.tar.gz
(... unpacked ...)
(base) C:\>cd PyAudio-0.2.11
(base) C:\PyAudio-0.2.11>
现在要获得与之前相同的结果,您需要将特殊参数传递给 setup.py
(当然,与 pip
的方式不同) ):
(base) C:\PyAudio-0.2.11>python setup.py build_ext --include-dirs="%CONDA_PREFIX%\pkgs\portaudio-19.6.0-hfa6e2cd_3\Library\include" --library-dirs="%CONDA_PREFIX%\pkgs\portaudio-19.6.0-hfa6e2cd_3\Library\lib" install
(compile errors: min macro redefinition, __typeof__ undefined)
现在,编辑文件 src\_portaudiomodule.c
,并删除/注释掉这些行(位于顶部,第 ~39 行):
#define min(a, b) \
({ \
__typeof__(a) _a = (a); \
__typeof__(b) _b = (b); \
_a < _b ? _a : _b; \
})
这个微不足道的宏就是罪魁祸首。如果您想向 Pham 先生 ( http://people.csail.mit.edu/hubert/pyaudio/ ) 提交修复,请不要删除它,而是使用类似的内容
#ifndef _MSC_VER
... #endif
。
保存文件并再次运行:
(base) C:\PyAudio-0.2.11>python setup.py build_ext --include-dirs="%CONDA_PREFIX%\pkgs\portaudio-19.6.0-hfa6e2cd_3\Library\include" --library-dirs="%CONDA_PREFIX%\pkgs\portaudio-19.6.0-hfa6e2cd_3\Library\lib" install
现在一切都应该好了。
编辑:TL;DR简单方法
再次检查后,我在https://repo.anaconda.com/pkgs/main/win-64
中看到了pyaudio
。这意味着,如果您使用 Anaconda,您可以执行以下操作:
conda install pyaudio
我将保留此答案的其余部分用于教育目的。
关于python - 在 Windows 上安装 PyAudio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53936589/