【问题标题】:Make (install from source) python without running tests在不运行测试的情况下制作(从源代码安装)python
【发布时间】:2017-11-26 06:09:04
【问题描述】:

我从源代码 tar 编译 python。一切正常,但测试运行了 2 小时和两次。如何绕过这些测试?

0:16:20 [178/405] test_inspect
0:16:26 [179/405] test_int
0:16:27 [180/405] test_int_literal
0:16:27 [181/405] test_io
0:18:18 [182/405] test_ioctl -- test_io passed in 1 min 51 sec
0:18:19 [183/405] test_ipaddress
0:18:22 [184/405] test_isinstance
0:18:23 [185/405] test_iter
0:18:24 [186/405] test_iterlen
0:18:25 [187/405] test_itertools
0:19:09 [188/405] test_json -- test_itertools passed in 44 sec
0:19:30 [189/405] test_keyword

结果

make 7724,86s user 188,63s system 101% cpu 2:10:18,93 total

我是这样分配的

PYTHON_VERSION = 3.6.1
PYTHON_URL = https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tar.xz

wget -O dl/Python-${PYTHON_VERSION}.tar.xz ${PYTHON_URL}

cd dl 
tar xf Python-${PYTHON_VERSION}.tar.xz

mkdir -p dl/Python-${PYTHON_VERSION}-build/
cd Python-${PYTHON_VERSION} 
    ./configure --enable-optimizations --prefix=$$(pwd)-build --cache-file=$$(pwd)/cache-file

此命令运行两次测试:

make -C dl/Python-${PYTHON_VERSION} -j8 
make -C dl/Python-${PYTHON_VERSION} -j8 install

附言这是另一个 make 文件的一部分。

【问题讨论】:

  • 你的压缩包是什么?
  • 你是如何构建的? make?
  • @Coldspeed 更新
  • @glegoux 3.6 来自 python.org

标签: python linux makefile build


【解决方案1】:

配置选项 --enable-optimizations 使运行测试套件能够生成用于分析 Python 的数据。生成的 python 二进制文件在执行 python 代码时具有更好的性能。注意到改进here

From configure help:
--enable-optimizations  Enable expensive optimizations (PGO, etc). Disabled by default.

来自维基百科

 profile-guided optimisation uses the results of profiling test runs of the instrumented program to optimize the final generated code.

简而言之,使用 --enable-optimizations 时不应跳过测试,因为分析所需的数据是通过运行测试生成的。 您可以运行make -j8 build_all,然后运行make -j8 install 以跳过测试一次(测试仍将使用install 目标运行),但这会破坏目的。 您可以改为删除配置标志以获得更好的构建时间。

【讨论】:

  • 这种情况恐怕没有出路。如果您不打算经常构建 python,请进行优化。
  • 优化运行几个小时是否正常?我尝试在 oracle linux 6 上安装 3.9.7,测试运行了 5 个多小时,然后我取消了它。如果我在测试阶段“cntrl+c”,构建会失败吗?
【解决方案2】:

只需构建和安装

make -j8 build_all
make -j8 altinstall

【讨论】:

    【解决方案3】:

    我在构建 Python 时对跳过测试运行进行了一些(快速)研究,方法是:

    • 配置 - 传递一些参数(例如--without-tests--disable-tests--skip-tests
    • make - 指定一些变量(通过 env vars 或 cmdline

    前者没有结果。后者(通过查看 Makefile 模板)揭示了通过调用 ${PYTHON_SRC_DIR}/Tools/scripts/run_tests.py 调用测试执行的事实(这设置了一些东西并调用另一个脚本,该脚本调用另一个脚本,...)。
    请注意,我在 Python 3.5(.4)Python 3.6(.4) 上找到了该文件,但在 没有 Python 2.7(.14)。更多研究表明,可以跳过(上述)测试运行。你需要做的是:

    make -C dl/Python-${PYTHON_VERSION} -j8 EXTRATESTOPTS=--list-tests install
    

    注意事项

    • Google 没有在 EXTRATESTOPTS 上显示任何(相关的)内容,所以我猜它是官方不支持
    • 您还可以在启动(内部)之前将EXTRATESTOPTS=--list-tests 设置为环境变量make
    • 不用说,如果在构建过程中发生了一些“小”错误(例如,非关键外部模块(例如 _ssl.so)构建失败),则不会有任何测试失败,所以你只能在运行时找到它(如果它发生在生产环境中,那就太糟糕了)

    @EDIT0

    经过@amohr 的评论,我决定多玩一点,所以我跑了整个过程:

    1. 配置(选择)
    2. 制作(选择)
    3. make install

    在具有 2 个 CPUs 的 Lnx (Ubtu 16) 机器上,其中一次(完整)测试运行大约需要 24 分钟。以下是我的发现(Python 3.6):

    • 它在 Python 3.5(.4) 上成功运行
    • 我之前建议的解决方案在第 3rd 步骤运行,因此它只跳过 第 2nd 测试运行:它运行在由 install 目标调用的(根)Makefiletest 目标 (make test) 上
    • 关于 1st 测试运行,通过检查 Makefilemake 的输出,这是我在2nd制作)步骤:

      1. C 源是“正常”构建的
      2. 正在运行测试(我推断某些配置文件数据存储在某处)
      3. C 源使用不同的标志重新构建(例如,在我的情况下,gcc-fprofile-generate-fprofile-use -fprofile-correction 替换(请查看 [GNU.GCC]: Options That Control Optimization 了解更多详情)) 以利用在上一个(子)步骤中生成的配置文件信息
    • 跳过第 1st 测试运行将自动意味着没有优化。实现方式:

      1. make build_all(在第 2nd 步) - 正如其他答案所建议的那样

        • 这是 configure (with --enable-optimizations) 生成的(根)Makefile 的 sn-p:

          all:            profile-opt
          build_all:      check-clean-src $(BUILDPYTHON) oldsharedmods sharedmods gdbhooks \
                          Programs/_testembed python-config
          
        • 还有一个没有它:

          all:            build_all
          build_all:      check-clean-src $(BUILDPYTHON) oldsharedmods sharedmods gdbhooks \
                          Programs/_testembed python-config
          
        • 如所见,正在运行:

          1. configure --enable-optimizations
          2. make build_all

          等同于:

          1. configure
          2. make
      2. 在 1st (configure --enable-optimizations) 和 2nd (make) 之间手动修改(根)Makefile >) 步骤:

        • 找到宏定义PROFILE_TASK=-m test.regrtest --pgo(对我来说它在~250行附近)
        • 在末尾添加--list-tests
        • 子步骤 (#2.)#1. 和 (#2.)#3. 完全相同,而对于 (#2.)#2.,测试没有运行。这可能意味着:
          • 第二个nd 源构建与第一个st 相同(这将使其完全无用)
          • 2nd 做了一些优化(没有任何信息),这意味着它可能在运行时崩溃(我认为/希望是前一种情况)

    【讨论】:

    • 我可以确认,EXTRATESTOPTS=--list-tests 在安装过程中可以在 Linux 上发挥作用。
    • 请注意,这不适用于 3.5.x,因为您会得到:“regrtest.py: error: unrecognized arguments: --list-tests”
    【解决方案4】:

    优化构建的默认构建目标包括运行测试。 要跳过它们,请尝试:

     make -C dl/Python-${PYTHON_VERSION} -j8 build_all
    

    【讨论】:

    • make build_all 似乎是该问题的正确答案。谢谢!
    【解决方案5】:

    我们在 python 3.7.6 中遇到了同样的问题,并且基于对 Makefile 的逆向工程,发现以下步骤也将在运行测试时快速构建 python(这样我们就不会失去 --enable-optimization 标志)

    cd /home/ubuntu
    PYTHON_VER=3.7.6
    wget https://www.python.org/ftp/python/$PYTHON_VER/Python-$PYTHON_VER.tgz
    tar xvf Python-$PYTHON_VER.tgz
    cd Python-$PYTHON_VER/
    ./configure --enable-loadable-sqlite-extensions --enable-optimizations
    make profile-gen-stamp; ./python -m test.regrtest --pgo -j8; make build_all_merge_profile; touch profile-run-stamp; make
    make install
    

    关键是通过将 -j8 传递给它来并行运行 python 测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      相关资源
      最近更新 更多