python pip安装 setuptools相关的一些奇怪问题

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系统的原因,英文系统就没这个坑爹问题)

 

print(len(out.splitlines())) 如果是gbk,list的长度是76,而如果是utf-16le,长度是6,少了70个,不知道为什么。
如果是gbk,env是个有内容的dict,如果是utf-16le,env是空的dict

 

总结 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   这一篇最关键

https://blog.csdn.net/MASILEJFOAISEGJIAE/article/details/108196825

 


然后就又出现了一个问题

fatal error C1083: 无法打开包括文件: “io.h”: No such file or directory

通过这个

运行pip install

 

 

然后 

error LNK2001: unresolved external symbol  __imp__PyThread_tss_create

 


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

posted @ 2024-10-22 16:29  hrdom  阅读(87)  评论(0编辑  收藏  举报