linux 在不运行测试的情况下生成(从源代码安装)python

ztyzrc3y  于 2022-12-11  发布在  Linux
关注(0)|答案(6)|浏览(185)

我从源代码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文件的一部分。

shyt4zoc

shyt4zoc1#

configure选项--enable-optimizations允许运行测试套件来生成Python性能分析所需的数据。生成的python二进制文件在执行python代码时具有更好的性能。

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标志以缩短构建时间。

sf6xfgos

sf6xfgos2#

只需构建并安装

make -j8 build_all
make -j8 altinstall
zmeyuzjn

zmeyuzjn3#

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

  • configure -传递一些参数(例如--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

备注

  • Googleing没有显示任何关于 EXTRATESTOPTS 的(相关)信息,所以我猜它没有得到官方支持
  • 您也可以在启动(inner)make 之前将EXTRATESTOPTS=--list-tests设置为环境变量
  • 不用说,如果在构建过程中发生了一些“小”错误(例如,一个非关键的外部模块(如 _ssl.so)构建失败),将不会有测试失败,因此您只能在运行时发现它(如果它发生在生产中,这将是非常糟糕的)
    @EDIT0

@amohr的评论之后,我决定再玩一点,所以我跑了整个过程:
1.* 配置 *(选项)
1.make(选择)

  1. make install
    在一个 LnxUbtu 16)机器上,2 CPU,其中一个(完整的)测试运行需要大约24分钟。下面是我的发现(Python 3.6):
  • Python 3.5(.4)运行成功**
  • 我之前建议的解决方案在第3步运行,因此它只跳过第2次测试运行:它在(根)Makefile 的***test***目标(make test)上运行,该目标由 install 目标调用

1.关于第一次测试运行,通过检查 Makefilemake 的输出,我发现在第二步(make)中会发生以下情况:
1.C 源“正常”构建
1.正在运行测试(我推断某些配置文件数据存储在某个地方)
1.C 源代码使用不同的标志重新构建(例如,在我的示例中,gcc-fprofile-generate-fprofile-use -fprofile-correction替换(有关详细信息,请查看[GNU.GCC]: Options That Control Optimization)),以利用在上一(子)步骤中生成的概要文件信息

  • 跳过第一次测试运行将自动意味着没有优化。实现方法:
  1. make build_all(第2步)-如其他答案所示
  • 下面是由 configure带有--enable-optimizations)生成的(根)Makefile 的代码片段:
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.如所见,跑步:

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

q5iwbnjs4#

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

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

weylhg0b5#

我们在python 3.7.6中遇到了同样的问题,基于Makefile的逆向工程,我们发现以下步骤可以在运行测试的同时快速构建python(这样我们就不会丢失on --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测试。

zbdgwd5y

zbdgwd5y6#

测试的第一部分是优化代码所必需的。简单地说,你不能/不应该跳过它。

相关问题