Avoir un script de lancement pour fixer les variables d’environnement lié à des outils (pas toujours installés dans des répertoires standard), le PATH (outils, Python), les alias pour faciliter le lancement de programme … est très utile. Je ne confie jamais à Windows cette tâche, le désavantage étant qu’il faut (forcément) lancer le script pour avoir l’environnement dans un terminal et utiliser ce terminal pour lancer les programmes. Depuis très longtemps j’utilise un batch setvars.bat qui est positionné soit dans C:\local en vis à vis d’installation d’outils hors système, ou dans le répertoire de développement (par exemple c:\Dev) ou encore dans un répertoire utilisateur. Et sous Linux (Ubuntu) c’est la même chose avec un script bash ou zsh, d’accord l’organisation fait un peu vintage, mais ç’est solide et ça marche encore.
Article mis à jour en Janvier 2025.
Navigation dans le guide
Guide [ Installation de Python sous Win-x64 ]
1. Activation d’un environnement
J’allège en ne mettant pas tous les outils, mais cela donne une idée réaliste de l’environnement Win-x64 concernant quelqu’un qui travaille à l’interface chimie-biologie-informatique.
Script [ setvars.bat ]
Le script débute par une entête qui permet d’utiliser un peu plus d’une centaine de commandes UNIX like (je tiens à mes habitudes, ls, ll, grep …) dans un environnement Windows :
|
1 2 3 4 5 6 7 8 9 10 |
@echo off echo. echo *** SETVARS (2024/09 PYTHON3) echo. echo *** Set Windows Paths set WINPATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;%LOCALAPPDATA%\Microsoft\WindowsApps echo . echo *** Set UNIX commands set SHELLCMDS=C:\Local\UxUtils\wbin echo. |
Puis une partie pour fixer des variables d’environnement et %PATH concernant des outils génériques, par exemple :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
rem rem Tools and libraries rem echo *** Set Graphviz and dot executables set GRAPHVIZ=C:\Local\Graphviz\bin echo *** Set GNUPLOT system set GNUPLOT=C:\Local\gnuplot\bin set GNUPLOT_LIB=C:\Local\gnuplot\demo;C:\Local\gnuplot\share echo *** Set GHOSTSCRIPT set GS=C:\Local\gs\bin rem echo *** Set NetCDF rem set NETCDF=C:\Local\netCDF4.4.1\bin echo *** Set DOXYGEN set DEOXYGEN=C:\Local\doxygen\bin echo. set GLIBS=%GRAPHVIZ%;%GS%;%GNUPLOT_LIB%;%GNUPLOT_BIN%;%DEOXYGEN% |
Une partie pour les logiciels métier, par exemple:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
rem rem Packages for medicinal chemistry rem echo *** Set OpenBabel set BABEL_DATADIR=C:\Local\OpenBabel-3.1.1\data set BABEL_BIN=C:\Local\OpenBabel-3.1.1 set BABEL_VER=3.1.1 set BABELS=%BABEL_DATADIR%;%BABEL_BIN%;%BABEL_VER% echo. echo *** Set MOLEGRO set MOLEGRO_BIN="C:\Program Files (x86)\Molegro\MVD\bin" echo. echo *** Set X-SCORE set XTOOL_HOME=C:\Local\xscore set XTOOL_PARAMETER=C:\Local\xscore\parameter set XSCORE_PARAMETER=C:\Local\xscore\parameter set XTOOL_BIN=C:\Local\xscore\bin set XSCORES=%XTOOL_HOME%;%XTOOL_PARAMETER%;%XSCORE_PARAMETER%;%XTOOL_BIN% echo. |
Puis on mouline les chemins d’accès, une habitude digne du XXème siècle :
|
1 2 3 4 5 6 7 8 |
rem rem set paths rem echo. echo *** Set Path set DEFPATH=%Path% set ALLTOOLS=%GLIBS%;%BABELS%;%XSCORES%;%MOLEGRO_BIN%; set Path=%SHELLCMDS%;.;%WINPATH%;%ALLTOOLS%; |
Enfin le choix de l’activation d’un environnement (base) ou (prod) ou juste les facilités UNIX like :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
rem rem Python3 rem echo *** Set conda environment echo (N) no environment echo (B) BASE environment echo (P) PROD environment :conda_choice set /P c=Choice [N, B, P]? if /I "%c%" EQU "B" goto :conda_base if /I "%c%" EQU "P" goto :conda_prod if /I "%c%" EQU "N" goto :conda_no goto :conda_choice :conda_prod echo. echo *** Setting conda environment (prod) call C:\Python3\Scripts\activate.bat prod goto :conda_no :conda_base echo. echo *** Setting conda environment (base) call C:\Python3\Scripts\activate.bat base goto :conda_no :conda_no |
Puis quelques alias pour les IDEs et un peu d’info sur le %PATH :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
rem rem aliases rem echo. echo *** Set some aliases rem doskey scite="C:\Local\SciTE\SciTE.exe" doskey scite="C:\Program Files (x86)\SciTE\SciTE.exe" echo alias: 'scite' for SciTE editor rem doskey geany="C:\Local\Geany\Bin\Geany.exe" doskey geany="C:\Program Files\Geany\Bin\Geany.exe" echo alias: 'geany' for Geany editor doskey spyder="C:\Users\Cob\AppData\Local\spyder-6\envs\spyder-runtime\Scripts\spyder.exe %*" echo alias: 'spyder' for Spyder IDE echo. echo *** Configuration information echo "--------------------------------------" echo %PATH% echo "--------------------------------------" echo. echo *** Going at home rem e: rem cd e:\test echo *** SETVARS *** done echo. |
En gros sous Ubuntu ça sera à peu près similaire à la syntaxe et localisation près.
Utiliser la commande setvars pour lancer le batch.
Ce qui donne quelque chose dans le style (extrait) pour lancer l’environnement (prod) si on répond par ‘P’:
C:\Dev>setvars*** SETVARS (2024/09 PYTHON3)*** Set Windows Paths*** Set UNIX commands*** Set Graphviz and dot executables… *** Set Path*** Set conda environment(N) no environment(B) BASE environment(P) PROD environmentChoice [N, B, P]?p*** Setting conda environment (prod)*** Set some aliasesalias: 'scite' for SciTE editoralias: 'geany' for Geany editor*** Configuration information...*** Going at home*** SETVARS *** done(prod) C:\Dev> |
L’environnement choisi étant paramétré, par exemple il ne reste qu’à lancer un IDE, défini en tant qu’alias, pour éditer des programmes.
2. Installation de (base) + miniforge3
Cette approche permet d’intégrer l’ordre des paquetages, les mises à jour, une vision globale et l’allumage/extinction d’options. C’est le gros morceau car le script installe la plupart des paquetages généralistes, à partir de l’installation initiale de Python. Pour la partie paquetages, chaque ligne correspond à un groupe de paquetages qui vont généralement ensemble et qu’il vaut mieux installer après d’autres groupes.
Script [ install-base.bat ]
Dans un premier temps, nous fixons le packager et les options:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
@echo off echo. echo *** WINDOWS: INSTALL-BASE (2025/01 PYTHON 3.12-BASE) echo *** INSTALL-ENV script echo. :packager rem rem Set the packager to use rem echo. echo *** Set packager echo -------------------------------------- rem set CONDA_MODE=conda set CONDA_MODE=mamba set CONDA_CMD=install --yes rem set CONDA_CMD=install echo. echo Packager is [%CONDA_MODE%] with OPTS [%CONDA_CMD%] :main echo. echo *** Main echo ------------------------------------------- echo *** Specfile (S) - Install (I) - Update (U) echo ------------------------------------------- set /P c=generate specfile [S/I/U]? if /I "%c%" EQU "S" goto :spec_file if /I "%c%" EQU "I" goto :install if /I "%c%" EQU "U" goto :update if /I "%c%" EQU "Q" goto :end |
Si installation, nous avons une séquence pour les différents paquetages :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
:install rem rem Install the packages - use rem to inactivate lines rem echo. echo *** Install the packages. echo -------------------------------------- rem check installation call %CONDA_MODE% %CONDA_CMD% bzip2 cftime ca-certificates certifi colorama dateutils expat et_xmlfile iniconfig icu jdcal krb5 libarchive libcurl libhwloc liblzma-devel libssh2 libxml2 libxslt lz4-c libzip libzlib lxml lzo nose openssl pip pluggy pyparsing pytz pytzdata python-dateutil python-tzdata setuptools six tbb tzdata urllib3 wheel xz xz-tools yaml-cpp zlib rem math libraries call %CONDA_MODE% %CONDA_CMD% liblapack rem call %CONDA_MODE% %CONDA_CMD% liblapacke call %CONDA_MODE% %CONDA_CMD% mkl mkl-service mkl_fft mkl_random rem call %CONDA_MODE% %CONDA_CMD% mkl-include mkl-devel call %CONDA_MODE% %CONDA_CMD% libblas libcblas rem call %CONDA_MODE% %CONDA_CMD% blas blas-devel call %CONDA_MODE% %CONDA_CMD% intel-openmp libgomp _openmp_mutex call %CONDA_MODE% %CONDA_CMD% libboost libboost-python rem call %CONDA_MODE% %CONDA_CMD% libboost-devel boost-cpp libboost-headers call %CONDA_MODE% %CONDA_CMD% eigen pcre ply sip swig toml tomli libclang libclang13 rem math packages call %CONDA_MODE% %CONDA_CMD% numpy call %CONDA_MODE% %CONDA_CMD% pandas rem call %CONDA_MODE% %CONDA_CMD% bottleneck numexpr call %CONDA_MODE% %CONDA_CMD% scipy rem fonts packages call %CONDA_MODE% %CONDA_CMD% font-ttf-dejavu-sans-mono font-ttf-inconsolata font-ttf-source-code-pro font-ttf-ubuntu call %CONDA_MODE% %CONDA_CMD% fonts-conda-ecosystem fonts-conda-forge call %CONDA_MODE% %CONDA_CMD% freetype libpng fontconfig call %CONDA_MODE% %CONDA_CMD% graphite2 harfbuzz call %CONDA_MODE% %CONDA_CMD% fonttools libbrotlicommon unicodedata2 libbrotlienc libbrotlidec brotli-bin brotli munkres rem graphical libraries call %CONDA_MODE% %CONDA_CMD% glib glib-tools libglib pixman libintl libintl-devel call %CONDA_MODE% %CONDA_CMD% libpng libtiff openjpeg giflib libjpeg-turbo gts call %CONDA_MODE% %CONDA_CMD% lcms2 lerc libdeflate libwebp-base call %CONDA_MODE% %CONDA_CMD% cairo pycairo rem PDF and renderers call %CONDA_MODE% %CONDA_CMD% poppler poppler-data call %CONDA_MODE% %CONDA_CMD% pango fribidi call %CONDA_MODE% %CONDA_CMD% freetype-py rlpycairo reportlab rem Libgcc, libgd, xorg et PIL/pillow call %CONDA_MODE% %CONDA_CMD% libgd libgcc libxcb getopt-win32 libwinpthread pthread-stubs xorg-libxau xorg-libxdmcp call %CONDA_MODE% %CONDA_CMD% xorg-libx11 xorg-libice xorg-libxext xorg-libsm xorg-libxt xorg-libxpm call %CONDA_MODE% %CONDA_CMD% pillow rem call %CONDA_MODE% %CONDA_CMD% libwebp rem trees call %CONDA_MODE% %CONDA_CMD% graphviz call %CONDA_MODE% %CONDA_CMD% networkx rem netcdf4 rem call %CONDA_MODE% %CONDA_CMD% hdf4 hdf5 libnetcdf netcdf4 rem internet call %CONDA_MODE% %CONDA_CMD% beautifulsoup4 soupsieve rem SGBDRs call %CONDA_MODE% %CONDA_CMD% greenlet typing-extensions sqlalchemy call %CONDA_MODE% %CONDA_CMD% libpq rem Excel and tools call %CONDA_MODE% %CONDA_CMD% openpyxl call %CONDA_MODE% %CONDA_CMD% attrs chardet colour importlib_resources jsonschema jsonschema-specifications lml pkgutil-resolve-name pyrsistent referencing rpds-py texttable zipp rem widgets call %CONDA_MODE% %CONDA_CMD% gst-plugins-base gstreamer libvorbis libogg call %CONDA_MODE% %CONDA_CMD% double-conversion call %CONDA_MODE% %CONDA_CMD% pyqt pyqt5-sip qt-main qt6-main call %CONDA_MODE% %CONDA_CMD% pyside6 rem call %CONDA_MODE% %CONDA_CMD% pywin32 rem call %CONDA_MODE% %CONDA_CMD% pmw rem call %CONDA_MODE% %CONDA_CMD% pyface pygments traits importlib-metadata rem plots and stats call %CONDA_MODE% %CONDA_CMD% contourpy kiwisolver qhull tornado cycler patsy statsmodels call %CONDA_MODE% %CONDA_CMD% matplotlib-base matplotlib call %CONDA_MODE% %CONDA_CMD% seaborn-base seaborn rem bio call %CONDA_MODE% %CONDA_CMD% biopython call %CONDA_MODE% %CONDA_CMD% biopandas looseversion msgpack-python mmtf-python rem for code call %CONDA_MODE% %CONDA_CMD% pycodestyle rem call %CONDA_MODE% %CONDA_CMD% pytest exceptiongroup rem call %CONDA_MODE% %CONDA_CMD% mock pytest-mock rem for console rem call conda install labscript-suite::windows-curses call %CONDA_MODE% %CONDA_CMD% pygments mdurl markdown-it-py rich echo. |
Puis une partie spécifique au cas ou cela soit nécessaire pour certains IDEs (ex: Spyder):
|
1 2 3 4 5 6 7 8 9 |
:ides rem rem for IDEs rem echo. echo *** For IDEs. echo -------------------------------------- rem call %CONDA_MODE% %CONDA_CMD% spyder-kernels=3.0 echo. |
De quoi faire une mise à jour générale:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
:update rem rem Launch a general update rem echo. echo *** General update. echo -------------------------------------- set /P c=start update [Y/N]? if /I "%c%" EQU "Y" goto :update_yes if /I "%c%" EQU "N" goto :clear :update_yes call %CONDA_MODE% update --all |
Puis générer un fichier de spécifications avec une ligne pour mamba et une pour conda :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
:spec_file rem rem List installed modules rem echo. call %CONDA_MODE% list echo. echo *** Generating list file 'base-packages.txt' rem call %CONDA_MODE% list --explicit > base-packages.txt call %CONDA_MODE% list > base-packages.txt :end rem rem Done rem echo. echo *** INSTALL-ENV *** done echo. |
3. Fichiers de spécification
On note que le script permet de peupler l’environnement préexistant (base) avec des paquetages, mais aussi de générer un fichier de spécifications avec une commande list redirigée vers un fichier de manière à sauver la liste des paquetages avant et/ou après l’installation.
Utilisation de conda
La ligne pour conda est call %CONDA_MODE% list --explicit > base-packages.txt ce qui donne un fichier qui contient la liste de chaque module et sous la forme url-canal-paquetage-version-build.conda :
# This file may be used to create an environment using:# $ conda create --name <env> --file <this file># platform: win-64@EXPLICIThttps://repo.anaconda.com/pkgs/main/win-64/blas-1.0-mkl.condahttps://repo.anaconda.com/pkgs/main/win-64/ca-certificates-2024.7.2-haa95532_0.conda... |
Utilisation de mamba
Mamba ne dispose pas de l’option --explicit, la ligne pour mamba est call %CONDA_MODE% list > base-packages.txt et donnera un fichier différent:
List of packages in environment: "C:\\Python3"
|
Dans les deux cas il sera possible d’exploiter ces fichiers pour une installation ou un clonage d’environnement.
4. Installation de (base) + miniforge3
Pour mémoire, car nous utilisons préférentiellement miniforge3. Dans ce cas conda sera exclusivement utilisé, le script install-base-miniconda.bat est très proche de son équivalent mamba précédent. Il y aura des différences dans la gestion des canaux:
|
1 2 3 4 5 |
if "%CONDA_MODE%" == "conda" ( call conda config --add channels conda-forge call conda config --show channels set CONDA_CMD=install --override-channels -n base -c conda-forge ) |
Dans le choix de certains paquetages, par exemple:
|
1 2 3 4 5 6 7 |
if "%CONDA_MODE%" == "conda" ( call %CONDA_MODE% %CONDA_CMD% numpy-base icc_rt numpy ) ... if "%CONDA_MODE%" == "conda" ( call %CONDA_MODE% %CONDA_CMD% conda-ecosystem fonts-anacall fonts-call ) |
Dans les modalités de mises à jour:
|
1 2 3 |
if "%CONDA_MODE%" == "conda" ( call %CONDA_MODE% update --override-channels -n base -c conda-forge --all ) |
Et l’option --explicit sera utilisable pour la génération du fichier de spécifications.
Notes d’installation
Il s’agit d’une installation mise à jour pour les ToS d’Anaconda. Dans le cas d’une distribution miniconda3 classique, conformément aux règles de construction des environnements Python, il n’y aura que des paquetages issus des canaux pkgs/main/win-64 (incluant des binaires-librairies) ou pkgs/main/noarch (des codes purement python).
5. Installation de (prod)
Le script est basé sur la même construction, mais il inclue des paquetage du canal conda-forge (conda-forge/noarch et conda-forge/win-64) ainsi que des appels éventuels à pip via des commandes pip install <nom-paquetage>.
Script [ install-prod.bat ]
Le script, à la date d’édition de l’article, est encore mixte: miniconda3/miniforge3.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
@echo off echo. echo *** WINDOWS: INSTALL-PROD (2025/01 PYTHON 3.12-PROD) echo *** INSTALL-ENV script echo. :packager rem rem Set the packager to use rem echo. echo *** Set packager echo -------------------------------------- rem set CONDA_MODE=conda set CONDA_MODE=mamba echo. if "%CONDA_MODE%" == "conda" ( call conda config --add channels conda-forge call conda config --show channels set CONDA_CMD=install --override-channels -n base -c conda-forge ) if "%CONDA_MODE%" == "mamba" ( set CONDA_CMD=install --yes rem set CONDA_CMD=install ) echo Packager is [%CONDA_MODE%] with OPTS [%CONDA_CMD%] |
Nous retrouvons les choix d’installation :
|
1 2 3 4 5 6 7 8 9 10 11 |
:main echo. echo *** Main echo ------------------------------------------- echo *** Specfile (S) - Install (I) - Update (U) echo ------------------------------------------- set /P c=generate specfile [S/I/U]? if /I "%c%" EQU "S" goto :spec_file if /I "%c%" EQU "I" goto :install if /I "%c%" EQU "U" goto :update if /I "%c%" EQU "Q" goto :end |
Avec deux possibilités conda (miniconda3) et mamba (miniforge3) pour l’installation des paquetages:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
:install rem rem Install the packages - use rem to inactivate lines rem echo. echo *** Install the packages. echo -------------------------------------- rem for conda and miniconda3 if "%CONDA_MODE%" == "conda" ( call conda update --override-channels -n prod -c conda-forge --all call %CONDA_MODE% remove biopython call %CONDA_MODE% %CONDA_CMD% vs2015_runtime call %CONDA_MODE% %CONDA_CMD% biopython call %CONDA_MODE% %CONDA_CMD% biopandas call %CONDA_MODE% %CONDA_CMD% inchi call %CONDA_MODE% %CONDA_CMD% chemspipy call %CONDA_MODE% %CONDA_CMD% openbabel call %CONDA_MODE% %CONDA_CMD% libboost-python call %CONDA_MODE% %CONDA_CMD% rdkit call %CONDA_MODE% %CONDA_CMD% threadpoolctl joblib scikit-learn ) rem for mamba and miniforge3 if "%CONDA_MODE%" == "mamba" ( call %CONDA_MODE% update --all call %CONDA_MODE% %CONDA_CMD% biopython call %CONDA_MODE% %CONDA_CMD% biopandas looseversion msgpack-python mmtf-python call %CONDA_MODE% %CONDA_CMD% inchi call %CONDA_MODE% %CONDA_CMD% chemspipy call %CONDA_MODE% %CONDA_CMD% openbabel call %CONDA_MODE% %CONDA_CMD% rdkit call %CONDA_MODE% %CONDA_CMD% threadpoolctl joblib scikit-learn ) |
Dans le cas de (prod) il est possible de compléter avec des paquetages installés par pip :
|
1 2 3 4 5 6 7 |
:pip rem rem Supplementary installs with pip rem echo. echo *** Supplementary installs with pip. rem call pip install oasa3 |
Puis des mises à jour générales:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
:update rem rem Launch a general update rem echo. echo *** General update. echo -------------------------------------- if "%CONDA_MODE%" == "conda" ( call %CONDA_MODE% update --override-channels -n prod -c conda-forge --all call %CONDA_MODE% update --override-channels -n prod -c conda-forge --all ) if "%CONDA_MODE%" == "mamba" ( call %CONDA_MODE% update --all call %CONDA_MODE% update --all ) |
Il y a plusieurs appels possibles à conda/mamba update qui font un peu bizarre: c’est une manière de résoudre des dépendances en cascade, qui marche ou qui cycle. Dans le cas d’une installation miniconda3 avec un environnement (base) constitué à partir du canal defaults, il fallait parfois 4 lignes de mise à jour car certains paquetages se remettaient à jour en changeant de canal.
Puis on termine en générant un fichier de spécifications :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
:spec_file rem rem List installed modules rem echo. call %CONDA_MODE% list echo. echo *** Generating list file 'prod-packages.txt' if "%CONDA_MODE%" == "conda" ( call %CONDA_MODE% list --explicit > prod-packages.txt ) if "%CONDA_MODE%" == "mamba" ( call %CONDA_MODE% list > prod-packages.txt ) :end rem rem Done rem echo. echo *** INSTALL-ENV *** done echo. |
Le fichier sera plus long que dans le cas de (base) car il inclura les paquetages de (base) et de (prod).
Il est recommandé de sauver quelques versions successives des fichiers de spécification de manière à pouvoir supprimer un environnement et de le recréer sur la même machine, sans passer par les scripts.
Liens et lectures
- Programmation Batch [ https://www.progmatique.fr/categorie-12-Batch.html ].
- Apprendre la programmation de script batch [ https://initscreen.developpez.com/tutoriels/batch/apprendre-la-programmation-de-script-batch/ ].