web-dev-qa-db-fra.com

Faire (installer à partir des sources) python sans exécuter de tests

Je compile python à partir de la source tar. Tout fonctionne bien, mais les tests durent 2 heures et 2 fois. Comment contourner ces tests?

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

À la suite

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

Je fais sa distribution comme ça

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

Cette commande exécute des tests deux fois:

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

p.s. Cela fait partie d'un autre fichier make.

14
eri

L'option de configuration --enable-optimizations permet aux suites de tests en cours d'exécution de générer des données permettant de profiler Python. Le binaire python résultant offre de meilleures performances pour l'exécution de code python. Améliorations constatées ici

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

De wikipedia

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

En bref, vous ne devez pas ignorer les tests lorsque vous utilisez --enable-optimizations car les données requises pour le profilage sont générées par les tests en cours. Vous pouvez exécuter make -j8 build_all suivi de make -j8 install pour ignorer les tests une fois (les tests seraient toujours exécutés avec install cible), mais cela irait à l’encontre de l’objet . Vous pouvez plutôt supprimer l’indicateur configure pour de meilleurs temps de génération.

25
nit

J'ai fait quelques recherches (rapides) pour ignorer les tests lors de la construction de Python en indiquant:

  • configure - passage de certains arguments (par exemple, --without-tests, --disable-tests, --skip-tests)
  • make - spécifiant une variable (via l'environnement ou la ligne de commande)

Le premier n'a donné aucun résultat. Ce dernier (en cherchant dans le modèle Makefile) a révélé le fait que l'exécution du test est appelée en appelant $ {PYTHON_SRC_DIR}/Tools/scripts/run_tests.py (qui définit appelle un autre script qui en appelle un autre, ...). Notez que j'ai trouvé le fichier sur Python3.5 (.4) et Python3.6 (.4) mais pas sur Python2.7 (.14 ). Un peu plus de recherches ont révélé qu'il est possible d'ignorer le test ci-dessus. Ce que vous devez faire c'est:

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

Remarques:

  • Google n'a rien révélé (pertinent) sur EXTRATESTOPTS, donc je suppose que c'est pas officiellement supporté
  • Vous pouvez également définir EXTRATESTOPTS=--list-tests comme variable d’environnement, avant de lancer (inner) make
  • Inutile de dire que si une erreur "mineure" s'est produite lors de la construction (par exemple, un module externe non critique (comme _ssl.so par exemple) a échoué), il n'y aura pas de test à échouer, donc vous ' Je n’en trouverai qu’au moment de l’exécution (ce qui serait terriblement désagréable si cela se produisait en production)

@ EDIT0:

Après le commentaire de @amohr, j’ai décidé de jouer un peu plus, alors j’ai exécuté tout le processus:

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

sur une Lnx _ (Ubtu16) machine avec 2 CPU s, où une analyse (complète) dure environ 24 minutes. Voici mes conclusions (Python3.6):

  • Il a exécuté avec succès sur (Python3.5 (.4))
  • La solution que j’ai suggérée plus tôt fonctionne au 3rd étape, donc il ne saute que le 2dakota du Nord test run: il fonctionne sur la cible (racine) Makefile _ test (make test) invoquée par install
  • En ce qui concerne le 1st test, en vérifiant la sortie de Makefile, et make, voici ce que j'ai découvert qui se passe à la 2dakota du Nord (make) étape:

    1. Les sources C sont construites "normalement"
    2. Les tests sont en cours d'exécution (j'ai déduit que certaines données de profil sont stockées quelque part)
    3. Les sources C sont reconstruites avec différents drapeaux (par exemple, dans mon cas, le -fprofile-generate de gcc _ a été remplacé par -fprofile-use -fprofile-correction - check [GNU]: Options contrôlant l'optimisation pour plus de détails ) pour utiliser les informations de profil générées à la (sous) étape précédente
  • Sauter le 1st le test impliquerait automatiquement aucune optimisation. Mode (s) de réalisation:

    • make build_all (à 2dakota du Nord étape) - comme suggéré par d'autres réponses

      • Voici un extrait de la (racine) Makefile générée par configure (avec l'option--enable-optimizations):

        all:            profile-opt
        build_all:      check-clean-src $(BUILDPYTHON) oldsharedmods sharedmods gdbhooks \
                        Programs/_testembed python-config
        
      • Et voici un sans le:

        all:            build_all
        build_all:      check-clean-src $(BUILDPYTHON) oldsharedmods sharedmods gdbhooks \
                        Programs/_testembed python-config
        
      • Comme vu, en cours d'exécution:

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

        est identique à:

        1. configure
        2. make
    • Modification manuelle de la (racine) Makefile entre 1st (configure --enable-optimizations) et 2nr (make) étapes:
      • Trouvez la définition de macro PROFILE_TASK=-m test.regrtest --pgo (pour moi, c'était autour de la ligne ~ 250)
      • Ajouter --list-tests à la fin
      • Les étapes ((2.) 1. et (2.) 3.) sont exactement les mêmes, alors que pour (2.) 2. les tests ne sont pas en cours. Cela peut signifier que soit:
        • Les deuxdakota du Nord la construction des sources est identique au 1st un (ce qui le rendrait complètement inutile)
        • Les deuxdakota du Nord fait quelques optimisations (sans aucune information), ce qui signifie qu'il pourrait planter à l'exécution (je pense/espère que c'est le cas précédent)
4
CristiFati

la cible par défaut pour les constructions optimisées inclut l'exécution des tests . pour les ignorer, essayez:

 make -C dl/Python-${PYTHON_VERSION} -j8 build_all
3
umläute

il suffit de construire et d'installer avec

make -j8 build_all
make -j8 altinstall
0
David Ding