make(从源代码安装)python而不运行测试

时间:2017-06-22 19:54:34

标签: python linux makefile build

我从源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

P.S。这是另一个make文件的一部分。

5 个答案:

答案 0 :(得分:35)

configure选项--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目标运行),但这样做会失败。 您可以改为删除configure标志以获得更好的构建时间。

答案 1 :(得分:6)

我通过指示:

在构建 Python 时跳过测试运行做了一些(快速)研究。
  • configure - 传递一些参数(例如--without-tests--disable-tests--skip-tests
  • make - 指定一些变量(通过 env var 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. configure (opts)
  2. make (opts)
  3. make install
  4. 在具有2个 CPU Lnx Ubtu 16 )计算机上,其中一次(完整)测试运行大约需要24分钟。以下是我的发现( Python 3.6 ):

    • Python 3.5(.4)
    • 成功运行
    • 我之前建议的解决方案是在3 rd 步骤中运行,因此它只跳过 2 nd 测试运行:它运行在(root) Makefile 测试 目标(make test)上,由 install < / em> target
    • 关于1 st 测试运行,通过检查 Makefile make 的输出,这里&# 39;我发现的事情发生在2 nd make )步骤:

      1. C 来源&#34;通常&#34;
      2. 正在运行测试(我扣除了某些配置文件数据存储在某处)
      3. 使用不同的标志重建 C 来源(例如,在我的情况下, gcc &#39; s -fprofile-generate-fprofile-use -fprofile-correction取代(检查[GNU.GCC]: Options That Control Optimization以获取更多详细信息))以使用在先前(子)步骤生成的配置文件信息
    • 跳过1 st 测试运行会自动暗示无优化。实现方式:

      1. make build_all(2 nd 步骤) - 正如其他答案所示

        • 此处&#39; configure 生成的(root) Makefile 的片段( --enable-optimizations) :

          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
          3. 与:

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

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:1)

只需构建并安装

make -j8 build_all
make -j8 altinstall

答案 4 :(得分:0)

我们在使用 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 测试。