python-3.x - 用 MinGW 或其他 C++ 编译器模仿 Visual C++(对于基于 Visual C++ 的 Python 包)?

标签 python-3.x windows visual-c++ visual-studio-code mingw

有没有办法使用 MinGW 代替 MS Visual C++?很多 Python 包需要安装 VS C++:4.5 GB 的磁盘空间! MinGW 仅占用 450 MB 并达到编译 C/C++ 的相同目标。

我正在使用 Visual Studio Code,我尽量避免安装 Microsoft Visual C++,这里建议在 3) --> 你也可以只安装 C++ Build Tools:https://code.visualstudio.com/docs/cpp/config-msvc/#_prerequisites

也许只是需要一个技巧来用MinGW模仿MS Visual C++,以便Python包直接找到MinGW编译器,就好像它是MS Visual C++一样?
也许将符号链接(symbolic link)添加到 lib 目录并添加一些系统变量路径?

我的问题与 Microsoft Visual C++ 14.0 is required (Unable to find vcvarsall.bat) 密切相关

以安装需要MS Visual C++为例的包时出现的错误,安装pip install dtaidistance :

  creating build\temp.win-amd64-3.7\Release\dtaidistance
  C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.26.28801\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -IC:\Users\Admin\Anaconda3\lib\site-packages\numpy\core\include -IC:\Users\Admin\Anaconda3\include -IC:\Users\Admin\Anaconda3\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.26.28801\include" /Tcdtaidistance/dtw_c.c /Fobuild\temp.win-amd64-3.7\Release\dtaidistance/dtw_c.obj /openmp /Ox /fp:fast /favor:INTEL64 /Og
  cl : Befehlszeile warning D9035 : Die Option "Og" ist veraltet und wird in einer der n„chsten Versionen entfernt.
  dtw_c.c
  C:\Users\Admin\Anaconda3\include\pyconfig.h(59): fatal error C1083: Datei (Include) kann nicht ge”ffnet werden: "io.h": No such file or directory
  error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\VC\\Tools\\MSVC\\14.26.28801\\bin\\HostX86\\x64\\cl.exe' failed with exit status 2
  ----------------------------------------
  ERROR: Failed building wheel for dtaidistance
  Running setup.py clean for dtaidistance
Failed to build dtaidistance
Installing collected packages: dtaidistance
  Running setup.py install for dtaidistance ... error
    ERROR: Command errored out with exit status 1:
     command: 'C:\Users\Admin\Anaconda3\python.exe' -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\Admin\\AppData\\Local\\Temp\\pip-install-5lb8uekg\\dtaidistance\\setup.py'"'"'; __file__='"'"'C:\\Users\\Admin\\AppData\\Local\\Temp\\pip-install-5lb8uekg\\dtaidistance\\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\Admin\AppData\Local\Temp\pip-record-dzfe2cwr\install-record.txt' --single-version-externally-managed --compile
         cwd: C:\Users\Admin\AppData\Local\Temp\pip-install-5lb8uekg\dtaidistance\

仅安装 MSVC (1.8 GB) 之后 - 仅作为测试,看看这是否已经是我所需要的:
installation of only MSVC

我们看到安装仍然失败,但错误略有变化,至少为 ERROR: Failed building wheel for dtaidistance现在已经消失了,看下面的截图:
    creating build\temp.win-amd64-3.7\Release\dtaidistance
    C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.26.28801\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -IC:\Users\Admin\Anaconda3\lib\site-packages\numpy\core\include -IC:\Users\Admin\Anaconda3\include -IC:\Users\Admin\Anaconda3\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.26.28801\include" /Tcdtaidistance/dtw_c.c /Fobuild\temp.win-amd64-3.7\Release\dtaidistance/dtw_c.obj /openmp /Ox /fp:fast /favor:INTEL64 /Og
    cl : Befehlszeile warning D9035 : Die Option "Og" ist veraltet und wird in einer der n„chsten Versionen entfernt.
    dtw_c.c
    C:\Users\Admin\Anaconda3\include\pyconfig.h(59): fatal error C1083: Datei (Include) kann nicht ge”ffnet werden: "io.h": No such file or directory
    error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\VC\\Tools\\MSVC\\14.26.28801\\bin\\HostX86\\x64\\cl.exe' failed with exit status 2
    ----------------------------------------
ERROR: Command errored out with exit status 1: 'C:\Users\Admin\Anaconda3\python.exe' -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\Admin\\AppData\\Local\\Temp\\pip-install-jr44cxi8\\dtaidistance\\setup.py'"'"'; __file__='"'"'C:\\Users\\Admin\\AppData\\Local\\Temp\\pip-install-jr44cxi8\\dtaidistance\\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\Admin\AppData\Local\Temp\pip-record-t_8xl3_a\install-record.txt' --single-version-externally-managed --compile Check the logs for full command output.

在上面 MS Visual++ 截图中 MSVC 复选框正下方安装了其他 4 个复选框后,我可以安装该软件包。

也许改变分配的C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\VC\\Tools\\MSVC\\14.26.28801\\bin\\HostX86\\x64\\cl.exe在 python 设置中的某处到 MinGW gcc 编译器 C:\Program Files (x86)\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin\c++.exe可能已经解决了?

最佳答案

这个想法没有机会。

  • 微软

  • 我已经向他们发送了反馈,但我没有得到任何回复。一位 Python 开发人员保证他们无论如何都知道这个大小问题并且也不喜欢它。唯一的机会是 MSVC 开发人员自己的改变。 MSVC 团队在 future 的版本中不太可能(但并非不可能)减小大小。
  • Python distutils 解决方法

  • Python 社区不会提供 distutils 解决方法,请参阅 https://discuss.python.org/t/imitate-visual-c-with-mingw-or-other-c-compilers-for-python-packages-based-on-visual-c/4609/11 .
    来自 Python 论坛的引用:

    There was a workaround until Python 3.4 which might also be an approach now: Use MinGW compiler till Python 3.4 by adding a “distutils.cfg” to the folder “\Lib\distutils” in Python install directory. It would be nice to have that MinGW “distutils.cfg” workaround for the recent Python versions as well.


    现在事实证明 distutils 将不是一个现实的解决方法。
  • 没有人会为此工作。一位之前参与过项目的Python开发者:也许有...

  • ... someone else who might offer to help. But I wouldn’t be too optimistic.


  • 还有一个弃用问题:

  • As an aside, now that setuptools has fully taken on distutils, we’ll be deprecating it in the standard library (soon). So this request in future would have to be made to each project implementing a build tool.

    关于python-3.x - 用 MinGW 或其他 C++ 编译器模仿 Visual C++(对于基于 Visual C++ 的 Python 包)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62149329/

    相关文章:

    python - 将元素附加到Python数组的列表之一

    windows - 使用注册表来启动一个程序,同时改变当前的工作目录?

    java - NSIS 和卸载时从 XML 读取

    c# - 如何检测是否未选择 ComboBox 上的任何选定项目?

    c++ - gcc 编译错误,在 Visual Studio 2008 C++ 中工作正常

    python - 即时解压缩下载的 gzip 内容

    python - 查找最大值或最小值的键

    python - 从迭代器中排除第一个元素 (Python)

    c - 如何在 MSVC++6 中声明 'ilogbf' 等 IEEE 数学函数?

    C++ std::tr1::hash::operator() 未定义?