python pip安裝 setuptools相關的一些奇怪問題

hrdom發表於2024-10-22

ERROR: Could not build wheels for UNKNOWN which use PEP 517 and cannot be in

透過pip install --upgrade pip setuptools wheel解決


然後又出現了error: Unable to find a compatible Visual Studio installation.

這個問題折磨了我兩個小時

csdn裡找到了_msvccompiler.py這個檔案發出的這個報錯

然後我就用everything搜這個檔案,找到了好幾次同名檔案(因為我Windows電腦裡有好幾個venv和conda環境),最終我開啟了看似正確的一個檔案。然後找到了這段程式碼

plat_spec = _get_vcvars_spec(get_host_platform(), plat_name)
print('plat_spec', plat_spec)

vc_env = _get_vc_env(plat_spec)
if not vc_env:
raise DistutilsPlatformError(
"Unable to find a compatible Visual Studio installation."
)
self._configure(vc_env)
然後我就在裡邊加print,想看看前邊具體輸出了什麼。然後神奇的發現加print不影響pip...後的報錯輸出。
這裡卡了我一個小時研究為什麼
然後最後用procmon.exe 監測python.exe讀寫了哪些檔案,然後發現有一些奇怪的路徑:...AppData\Local\Temp\pip-build-env-ktr9eg46\overlay\Lib\site-packages...
詢問gpt,pip-build-env,發現
當你使用 pip 安裝一些需要編譯的 Python 包時,尤其是那些包含 C 擴充套件模組的包(例如 pandas、scipy 等),pip 可能需要構建這些包。這時,它會在 AppData\Local\Temp 資料夾中建立一個臨時的構建環境。這個構建環境會包含一些必要的依賴項,比如編譯器和構建工具,這些工具和庫只用於包的安裝過程,並不會永久保留在系統中。
安裝構建依賴:pip 會自動根據包的 pyproject.toml 檔案中指定的依賴(例如 setuptools、wheel、Cython 等)來安裝必須的構建工具和庫。這些依賴只在臨時環境中存在,目的是幫助包完成編譯。

然後我就去找這個“所需安裝的包”的pyproject.toml檔案

https://github.com/MahmoudAshraf97/ctc-forced-aligner/blob/main/pyproject.toml

[build-system]
requires = ["setuptools>=42", "wheel", "pybind11"]
build-backend = "setuptools.build_meta"

然後問gpt,得到不使用臨時的setuptools的辦法 pip install --no-build-isolation <package_name>

因為我需要除錯一下這個報錯上邊的變數資訊。

然後發現pdb莫名報錯 bdb.BdbQuit,只能慢慢print了

然後經過幾次print,發現

try:
out = subprocess.check_output(
'cmd /u /c "{}" {} && set'.format(vcvarsall, plat_spec),
stderr=subprocess.STDOUT,
).decode('utf-16le', errors='replace')

這個out,pinrt(out)會報錯UnicodeEncodeError: 'gbk' codec can't encode character '\u4c41' in position

print()函式自身有限制,不能完全列印所有的unicode字元。

type(out)是type <class 'str'>

然後我就又

temp = subprocess.check_output(
f'cmd /u /c "{vcvarsall}" {plat_spec} && set',
stderr=subprocess.STDOUT,
)
print(temp)

試了一下

結果是

b"*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00\r\x00\n\x00*\x00*\x00 \x00V\x00i\x00s\x00u\x00a\x00l\x00 \x00S\x00t\x00u\x00d\x00i\x00o\x00 \x002\x000\x001\x009\x00 \x00D\x00e\x00v\x00e\x00l\x00o\x00p\x00e\x00r\x00 \x00C\x00o\x00m\x00m\x00a\x00n\x00d\x00 \x00P\x00r\x00o\x00m\x00p\x00t\x00 \x00v\x001\x006\x00.\x001\x000\x00.\x000\x00\r\x00\n\x00*\x00*\x00 \x00C\x00o\x00p\x00y\x00r\x00i\x00g\x00h\x00t\x00 \x00(\x00c\x00)\x00 \x002\x000\x002\x001\x00 \x00M\x00i\x00c\x00r\x00o\x00s\x00o\x00f\x00t\x00 \x00C\x00o\x00r\x00p\x00o\x00r\x00a\x00t\x00i\x00o\x00n\x00\r\x00\n\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00*\x00\r\x00\n\x00[\x00v\x00c\x00v\x00a\x00r\x00s\x00a\x00l\x00l\x00.\x00b\x00a\x00t\x00]\x00 \x00E\x00n\x00v\x00i\x00r\x00o\x00n\x00m\x00e\x00n\x00t\x00 \x00i\x00n\x00i\x00t\x00i\x00a\x00l\x00i\x00z\x00e\x00d\x00 \x00f\x00o\x00r\x00:\x00 \x00'\x00x\x008\x006\x00_\x00x\x006\x004\x00'\x00\r\x00\n\x00ALLUSERSPROFILE=C:\\ProgramData\r\nAPPDATA=C:\\Users\\xxx\\AppData\\Roaming\r\nASL.LOG=Destination=file\r\nCLION=C:\\Program Files\\JetBrains\\CLion 2020.1.2\\bin;\r\n ......

手動執行結果是 & "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x86_amd64
**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.10.0
** Copyright (c) 2021 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x86_x64'

簡單來說就是,temp是個bytes型別,然後經過.decode('utf-16le', errors='replace'),變成str型別,但是這個str中會有gbk不包含的字元(utf-16le包含但是gbk不包含),而python的print輸出的字元只能是gbk中包含的(關於為什麼是gbk,應該是中文windows系統的原因,英文系統就沒這個坑爹問題)

總結 utf-16le改成gbk(csdn部落格裡說改成utf-8 自測不行

out = subprocess.check_output(
f'cmd /u /c "{vcvarsall}" {plat_spec} && set',
stderr=subprocess.STDOUT,
).decode('gbk', errors='replace')

參考了

https://stackoverflow.com/questions/70964408/how-do-i-solve-this-error-when-installing-web3-library-using-pip

https://stackoverflow.com/questions/40018405/cannot-open-include-file-io-h-no-such-file-or-directory

https://blog.csdn.net/qq_43956104/article/details/116129320 這一篇最關鍵


然後就又出現了一個問題

fatal error C1083: 無法開啟包括檔案: “io.h”: No such file or directory


pip install git+https://github.com/MahmoudAshraf97/ctc-forced-aligner.git

相關文章