如何源码安装 SciPy v1.10.1 for Python3.8 Win32 科学计算扩展库


SciPy 是可以为数学、科学、工程、等领域,提供基础算法的开源 Python 扩展库。

注意: 由于 SciPy 编译过程复杂、问题多,很难成功,建议使用预构建包 (或回退到使用旧版)。

本次有编译 SciPy v1.8.1 (有修正缺失文件路径, 后面编译 Fortran 相关源文件通不过)、1.9.3 (无法修正缺失文件路径)、1.10.1 (无法修正缺失文件路径),均未取得成功。

若不使用微软 Windows 10 en-US 版进行编译,一开始就会出现 UnicodeDecodeError 异常 导致无法继续。

  1. Visual C/C++

  2. 需要安装 16.0 v2019 以上 Visual Studio C/C++ Build Tools en-US 官方完整版。

    点击 网盘 (提取码: tyc0) 链接, 下载 v2019 或更高版本 Visual Studio C/C++ Build Tools。

  3. GFortran 编译器

  4. 点击 网盘 (提取码: hr7k) 链接, 下载 i686-12.2.0-release-win32-dwarf-msvcrt-rt_v10-rev2.7z

    将下载文件 i686-12.2.0-release-win32-dwarf-msvcrt-rt_v10-rev2.7z 解压到以下目录

    D:/mingw32/
    						

    D:/mingw32/bin/ 目录下有 gfortran.exe 编译器可执行文件;把以下字符串

    D:/mingw32/bin/
    						

    添加到 控制台配置 对话框/ 工作目录 文本视图。

  5. CMake 编译器

  6. 点击 网盘 (提取码: 35gb) 链接, 下载 cmake-3.29.4-windows-i386.msi

    将下载文件 cmake-3.29.4-windows-i386.msi 安装到以下目录

    D:/CMake/
    							

    D:/CMake/bin/ 目录下有 cmake.exe 编译器可执行文件; 把以下字符串

    D:/CMake/bin/
    						

    添加到 控制台配置 对话框/ 工作目录 文本视图。

  7. meson 依赖库

  8. 控制台 选项卡键入 meson v1.4.1 依赖库安装命令:

    Python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade meson
    						

    将 meson 安装到 Python 目录下。

    Python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade --user meson
    						

    将 meson 安装到当前用户 python 目录 (如 C:/Users/用户名/AppData/Local/python/) 下。

  9. pybind11 依赖库

  10. 控制台 选项卡键入 pybind11 v2.12.0 依赖库安装命令:

    Python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pybind11
    						

    将 pybind11 安装到 Python 目录下。

    Python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade --user pybind11
    						

    将 pybind11 安装到当前用户 python 目录 (如 C:/Users/用户名/AppData/Local/python/) 下。

  11. cython 依赖库

  12. 控制台 选项卡键入 cython v0.29.27 依赖库安装命令:

    Python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade cython==0.29.27
    						

    将 cython 安装到 Python 目录下。

    Python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade --user cython==0.29.27
    						

    将 cython 安装到当前用户 python 目录 (如 C:/Users/用户名/AppData/Local/python/) 下。

  13. numpy 依赖库

  14. 控制台 选项卡键入 numpy v1.22.4 (v1.23.0 将弃用 numpy.distutils, Python v3.12 将移除 distutils 内置模块) 依赖库安装命令:

    Python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade cython==1.22.4
    						

    将 numpy 安装到 Python 目录下。

    Python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade --user cython==1.22.4
    						

    将 numpy 安装到当前用户 python 目录 (如 C:/Users/用户名/AppData/Local/python/) 下。

  15. pythran 依赖库

  16. 控制台 选项卡键入 pythran v0.16.1 依赖库安装命令:

    Python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pythran
    						

    将 pythran 安装到 Python 目录下。

    Python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade --user pythran
    						

    将 pythran 安装到当前用户 python 目录 (如 C:/Users/用户名/AppData/Local/python/) 下。

  17. setuptools 依赖库

  18. 控制台 选项卡,键入以下命令将 setuptools 内置库版本切换到 70.0.0 或更高版本:

    Python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade setuptools==70.0.0
    						

    numpy v1.22.4 依赖库要求必须使用 setuptools v70.0.0。

  19. OpenBLAS 编译 (不需要)

  20. BLAS 比 Lapack 中的 netlib Blas 性能更好。

    BLAS 是 Basic Linear Algebra Subprograms 的缩写,中文译为 基本线性代数子程序

    点击 网盘 (提取码: 1y0s) 链接, 下载 OpenBLAS-0.3.27.tar.gz 源代码;将 OpenBLAS-0.3.27.tar.gz 解压到以下目录

    D:/OpenBLAS-0.3.27/
    						

    控制台 选项卡键入下列命令,以共享库方式编译 OpenBLAS:

    cd D:/OpenBLAS-0.3.27
     
    mkdir build && cd build
    cmake .. -G "MinGW Makefiles" -D CMAKE_INSTALL_PREFIX=D:/OpenBLAS-0.3.27 -D BUILD_SHARED_LIBS=ON
     
    mingw32-make -j
    mingw32-make install
    						

    编译完成后,为当前用户添加以下环境变量 (需要重启电脑)

    OPENBLAS = D:\OpenBLAS-0.3.27\lib
    						

    或添加到 控制台配置 对话框/更多/ 添加变量 文本视图 (不用重启电脑)。

  21. Lapack 编译

  22. 点击 网盘 (提取码: 1y0s) 链接, 下载 lapack-3.12.0.tar.gz 源代码;将 lapack-3.12.0.tar.gz 解压到以下目录

    D:/lapack-3.12.0/
    						

    控制台 选项卡键入下列命令,以共享库方式编译 lapack:

    cd D:/lapack-3.12.0
     
    mkdir build && cd build
    cmake .. -G "MinGW Makefiles" -D CMAKE_INSTALL_PREFIX=D:/lapack-3.12.0 -D BUILD_SHARED_LIBS=ON -D LAPACKE=ON -D CBLAS=ON
     
    mingw32-make -j
    mingw32-make install
    						

    或以静态库方式编译 lapack:

    cd .. && rmdir /s /q build && mkdir build && cd build
    cmake .. -G "MinGW Makefiles" -D CMAKE_INSTALL_PREFIX=D:/lapack-3.12.0 -D BUILD_SHARED_LIBS=OFF -D LAPACKE=ON -D CBLAS=ON
     
    mingw32-make -j
    mingw32-make install
    						

    编译完成后,为当前用户添加以下环境变量 (需要重启电脑)

    LAPACK = D:\lapack-3.12.0\bin
    LAPACK_SRC = D:\lapack-3.12.0\SRC
     
    BLAS = D:\lapack-3.12.0\bin
    BLAS_SRC = D:\lapack-3.12.0\SRC
    						

    或添加到 控制台配置 对话框/更多/ 添加变量 文本视图 (不用重启电脑)。

  23. Boost 编译 (不需要)

  24. 点击 网盘 (提取码: 1y0s) 链接, 下载 boost_1_85_0.7z 源代码;将 boost_1_85_0.7z 解压到以下目录

    D:/boost_1_85_0/
    						

    控制台 选项卡键入下列命令,以共享库方式编译 Boost:

    cd D:/boost_1_85_0
    bootstrap.bat # 编译生成 b2.exe
     
    b2 --help
    b2 stage --build-type=complete --toolset=gcc --stagedir="D:\boost_1_85_0\build" link=shared runtime-link=shared threading=multi debug release
    						

    回到 控制台 选项卡,把以下字符串

    D:/boost_1_85_0/bulid/mingw/lib/
    						

    添加到 控制台配置 对话框/ 工作目录 文本视图。

  25. 源码获取

  26. 点击 网盘 (提取码: 1y0s) 链接, 下载 scipy-1.10.1.zip 源代码。

    将 scipy-1.10.1.zip 解压到以下目录

    D:/Python38-32/scipy-1.10.1/
    							

  27. 源码编译

  28. 回到 控制台 选项卡,把以下字符串

    D:/Python38-32/
    D:/Python38-32/Scripts/
    						

    添加到 控制台配置 对话框/ 工作目录 文本视图。

    键入以下 DOS 命令 进入 scipy v1.10.1 源码目录:

    cd D:/Python38-32/scipy-1.10.1/
    						

    键入以下 Python 扩展模块通用编译命令,开始编译 scipy v1.10.1 源码:

    python setup.py bdist_wheel
    python setup.py build
    						
  29. 异常处理

    1. 编译 scipy-1.10.1/scipy/stats/_generate_pyx.py 文件时,若引发
    2. UnicodeDecodeError: 'gbk' codec can't decode byte 0x93 in position 52813: illegal multibyte sequence
      							

      将 scipy-1.10.1/scipy/stats/_generate_pyx.py 文件中的以下源代码

      def make_unuran(srcdir, outdir):
          """Substitute True/False values for NPY_OLD Cython build variable."""
       
          import re
          with open(srcdir / "unuran_wrapper.pyx.templ", "r") as src:
              contents = src.read()
          with open(outdir / "unuran_wrapper.pyx", "w") as dest:
              dest.write(re.sub("DEF NPY_OLD = isNPY_OLD", f"DEF NPY_OLD = {isNPY_OLD()}", contents))
      							

      修改成

      def make_unuran(srcdir, outdir):
          """Substitute True/False values for NPY_OLD Cython build variable."""
       
          import re
          with open(srcdir / "unuran_wrapper.pyx.templ", "r", errors="ignore") as src:
              contents = src.read()
          with open(outdir / "unuran_wrapper.pyx", "w") as dest:
              dest.write(re.sub("DEF NPY_OLD = isNPY_OLD", f"DEF NPY_OLD = {isNPY_OLD()}", contents))
      							
    3. 编译 scipy-1.10.1/scipy/stats/_unuran/unuran_wrapper.pyx 文件时,若引发
    4. unuran_wrapper.pyx:109:9: Decoding error, missing or incorrect coding=<encoding-name> at top of source (cannot decode with encoding 'utf-8': invalid continuation byte)
      							

      注意: 若存在此问题且无法解决,请使用微软 Windows 10 en-US 版进行编译。

版权声明: 本文为独家原创稿件,版权归 乐数软件 ,未经许可不得转载。