Сделать (установить из исходного) 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.
Ответы
Ответ 1
Опция 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 для лучшего времени сборки.
Ответ 2
Я сделал небольшое (быстрое) исследование по пропуску тестовых прогонов при создании Python, указав либо:
- configure - передача некоторых аргументов (например,
--without-tests
, --disable-tests
, --skip-tests
)
- make - указание некоторой переменной (через среду или командную строку)
Первые не дали никаких результатов. Последнее (путем поиска в шаблоне Makefile) показало, что выполнение теста вызывается, вызывая ${PYTHON_SRC_DIR}/Tools/scripts/run_tests.py(который устанавливает некоторые вещи и вызывает другой script, который вызывает другой,...). Обратите внимание, что я нашел файл на Python3.5 (.4) и Python3.6 (.4), но не на Python2.7 (.14). Немного больше исследований показали, что можно пропустить (выше) тестовый прогон. Что вам нужно сделать:
make -C dl/Python-${PYTHON_VERSION} -j8 EXTRATESTOPTS=--list-tests install
Примечания
- Google не показывал ничего (релевантно) на
EXTRATESTOPTS
, поэтому я предполагаю, что не поддерживается официально
- Вы также можете установить
EXTRATESTOPTS=--list-tests
как переменную среды, прежде чем запускать (внутреннее) make
- Излишне говорить, что если во время сборки возникла некоторая "незначительная" ошибка (например, некритический внешний модуль (например, _ssl.so, например) не удалось построить), тестов не будет терпеть неудачу, поэтому вы найдете об этом во время выполнения (что было бы ужасно неприятно, если бы это произошло в производстве).
@EDIT0
После комментария @amohr я решил немного поиграть, поэтому я выполнил весь процесс:
-
configure
(opts)
-
make
(opts)
-
make install
на машине Lnx (Ubtu16) с двумя процессорами, где один (полный) тестовый запуск занимает ~ 24 минуты. Вот мои выводы (Python3.6):
- Он успешно прошел на Python3.5 (.4)
- Решение, которое я предложил ранее, работает на этапе 3 rd поэтому он пропускает тестовый прогон 2 nd: он работает на (root) Makefile
test
target (make test
), который вызывается install
-
Что касается тестового прогона 1 st проверив Makefile и сделав вывод, вот что я обнаружил, что происходит при 2 nd (make
):
- Источники C строятся "нормально"
- Выполняются тесты (я вычитал, что некоторые данные профиля хранятся где-то)
- Источники C перестраиваются с разными флагами (например, в моем случае gcc
-fprofile-generate
был заменен на -fprofile-use -fprofile-correction
- проверить [GNU]: параметры, которые Оптимизация управления для получения дополнительной информации), чтобы использовать информацию профиля, сгенерированную на предыдущем (вспомогательном) шаге.
-
Пропуск тестового прогона 1 st будет автоматически подразумевать без оптимизации. Путь достижения:
Ответ 3
цель построения по умолчанию для оптимизированных сборок включает запуск тестов.
чтобы пропустить их, попробуйте:
make -C dl/Python-${PYTHON_VERSION} -j8 build_all
Ответ 4
просто собрать и установить с
make -j8 build_all
make -j8 altinstall