Сделать (установить из исходного кода) python без запуска тестов

я компилирую python из исходного tar. Все работает хорошо, но тесты работают 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.

3 ответов


параметр 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 target), но это приведет к поражению цели. Вместо этого вы можете удалить флаг configure для лучшего времени сборки.


я сделал некоторые (быстрые) исследования по пропуску тестовых запусков при строительстве Python, указывая следующее:

  • настроить - передача некоторых args (например,--without-tests, --disable-tests, --skip-tests)
  • сделать - указание некоторой переменной (через среду или командную строку)
make-файл шаблон) показал тот факт, что выполнение теста вызывается вызовом ${PYTHON_SRC_DIR}/Tools/scripts/run_tests.py (который устанавливает некоторые вещи и вызывает другой скрипт, который вызывает другой,...). Обратите внимание, что я нашел файл на Питон3.5(.4) и Питон3.6(.4) но не on вместо python2.7(.14). Немного больше исследований показало, что можно пропустить (выше) тестовый запуск. Что вам нужно сделать есть:
make -C dl/Python-${PYTHON_VERSION} -j8 EXTRATESTOPTS=--list-tests install

Примечания:

  • Google не показал ничего (относящегося) на EXTRATESTOPTS, так что я думаю, это официально не поддерживается
  • вы также можете установить EXTRATESTOPTS=--list-tests в качестве переменной среды перед запуском (внутренний) сделать
  • Излишне говорить, что если во время сборки произошла какая-то" незначительная " ошибка (например, некритический внешний модуль (например,_ssl.так что для пример) не удалось построить), не будет никаких тестов для сбоя, поэтому вы найдете об этом только во время выполнения (что было бы ужасно неприятно, если бы это произошло в производстве)

@EDIT0:

после комментария @amohr я решил сыграть немного больше, поэтому я запустил весь процесс:

  1. configure (opts)
  2. make (opts)
  3. make install

на a сайт lnx (Ubtu16) машина с 2 CPUs, где один (полный) тестовый прогон занимает ~24 минуты. Вот мои выводы (Питон3.6):

  • это успешно on Питон3.5(.4)
  • решение, которое я предложил ранее, работает на 3 rd шаг, поэтому он только пропускает в 2nd):
    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
  • ручное изменение (root)make-файл от 1st (configure --enable-optimizations) и 2nr (make) шаги:
    • найти определение макроса PROFILE_TASK=-m test.regrtest --pgo (для меня это было по линии ~250)
    • добавить --list-tests в конце
    • шаги ((2.)1. и (2.)3.) точно так же, в то время как для (2.)2. тесты не выполняются. Это может означать, что либо:
      • в 2nd сборка источников идентична 1st один (что сделало бы его совершенно бесполезным)
      • в 2nd выполняет некоторые оптимизации (без какой-либо информации), что означает, что он может произойти сбой во время выполнения (I думаю / надеюсь, что это первый случай)

  • цель сборки по умолчанию для оптимизированных сборок включает выполнение тестов. чтобы пропустить их, попробуйте:

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