Python : environnement virtuel sous OpenBSD

Article publié, le et modifié le
3 minute(s) de lecture

Cet article contient 603 mots.
Source brute de l'article : MD

Description

  • OS : OpenBSD 6.x

Depuis OpenBSD 6.0, l’option de montage wxallowed est configuré par défaut sur /usr/local. Pour ceux qui ne le savent pas, c’est une protection système. Si la partition a cette option, les logiciels sont autorisés à fonctionner depuis cette partition, sinon ils ne pourront fonctionner et émettront un message de violation W^X, tel que :

$ dmesg | grep wxallowed
/home/hs/.local/share/virtualenvs/mybeautifullproject-q1koN8ay/bin/python3(26392): W^X binary outside wxallowed mountpoint

De fait, puisque seul /usr/local a cette option activée, si vous tentez d’exécuter un programme depuis, par exemple, votre $HOME, cela ne fonctionnera pas. Et, c’est tout le problème avec les environnements Python qui doivent fonctionner dans votre répertoire personnel.

Dans les faits, voici ce qui se passe pour virtualenv :

Code : shell

$ virtualenv mybeautifullproject                                            
Using base prefix '/usr/local'
New python executable in $HOME/python/mybeautifullproject.py/mybeautifullproject/bin/python3
Also creating executable in $HOME/python/mybeautifullproject.py/mybeautifullproject/bin/python
ERROR: The executable $HOME/python/mybeautifullproject.py/mybeautifullproject/bin/python3 could not be run: [Errno 13] Permission denied: '$HOME/python/mybeautifullproject.py/mybeautifullproject/bin/python

C’est pareil pour pipenv :

Code : shell

$ pipenv install requests
Warning: the environment variable LANG is not set!
We recommend setting this in ~/.profile (or equivalent) for proper expected behavior.
Creating a virtualenv for this project…
Pipfile: $HOME/python/mybeautifullproject.py/Pipfile
Using /usr/local/bin/python3 (3.6.8) to create virtualenv…
⠇ Creating virtual environment...Already using interpreter /usr/local/bin/python3
Using base prefix '/usr/local'
New python executable in $HOME/.local/share/virtualenvs/mybeautifullproject.py-oFlnu9vD/bin/python3
Also creating executable in $HOME/.local/share/virtualenvs/mybeautifullproject.py-oFlnu9vD/bin/python
ERROR: The executable $HOME/.local/share/virtualenvs/mybeautifullproject.py-oFlnu9vD/bin/python3 could not be run: [Errno 13] Permission denied: '$HOME/.local/share/virtualenvs/mybeautifullproject.py-oFlnu9vD/bin/python3'

✘ Failed creating virtual environment
[pipenv.exceptions.VirtualenvCreationException]:   File "$HOME/.local/lib/python3.6/site-packages/pipenv/cli/command.py", line 254, in install
[pipenv.exceptions.VirtualenvCreationException]:       editable_packages=state.installstate.editables,
[pipenv.exceptions.VirtualenvCreationException]:   File "$HOME/.local/lib/python3.6/site-packages/pipenv/core.py", line 1741, in do_install
[pipenv.exceptions.VirtualenvCreationException]:       pypi_mirror=pypi_mirror,
[pipenv.exceptions.VirtualenvCreationException]:   File "$HOME/.local/lib/python3.6/site-packages/pipenv/core.py", line 574, in ensure_project
[pipenv.exceptions.VirtualenvCreationException]:       pypi_mirror=pypi_mirror,
[pipenv.exceptions.VirtualenvCreationException]:   File "$HOME/.local/lib/python3.6/site-packages/pipenv/core.py", line 506, in ensure_virtualenv
[pipenv.exceptions.VirtualenvCreationException]:       python=python, site_packages=site_packages, pypi_mirror=pypi_mirror
[pipenv.exceptions.VirtualenvCreationException]:   File "$HOME/.local/lib/python3.6/site-packages/pipenv/core.py", line 935, in do_create_virtualenv
[pipenv.exceptions.VirtualenvCreationException]:       extra=[crayons.blue("{0}".format(c.err)),]
[pipenv.exceptions.VirtualenvCreationException]:
Failed to create virtual environment.

D’autant que ce n’est vraiment pas un problème de droits utilisateurs :

Code : shell

$ ls -al mybeautifullproject/                                                
total 40
drwxr-xr-x  5 hs  hs  512 Jun  3 01:43 ./
drwxr-xr-x  3 hs  hs  512 Jun  3 01:44 ../
drwxr-xr-x  2 hs  hs  512 Jun  3 01:43 bin/
drwxr-xr-x  2 hs  hs  512 Jun  3 01:43 include/
drwxr-xr-x  3 hs  hs  512 Jun  3 01:43 lib/

$ ls -al mybeautifullproject/bin/                                            
total 40
drwxr-xr-x  2 hs  hs    512 Jun  3 01:43 ./
drwxr-xr-x  5 hs  hs    512 Jun  3 01:43 ../
lrwxr-xr-x  1 hs  hs      7 Jun  3 01:43 python@ -> python3
-rwxr-xr-x  1 hs  hs  10680 Jun  3 01:43 python3*
lrwxr-xr-x  1 hs  hs      7 Jun  3 01:43 python3.6@ -> python3

Configuration

Une petite modification système va faciliter notre vie - puisque /usr/local est la seule partition autorisée à l’exécution des programmes qui nécessitent la violation W^X :

  • Création d’un répertoire utilisateur dedans :
    # mkdir -p /usr/local/${my_user}/python
  • Attribution des droits utilisateur et groupe correcte :
    # chown -R ${my_user}:wheel /usr/local/${my_user}
  • Création d’un lien symbolique :
    # ln -s /usr/local/${my_user}/python $home/python

Remplacez ${my_user} par votre identifiant de session ;)

Si vous avez la bonne idée d’utiliser l’outil pipenv, il faudra créer un nouveau répertoire et le lier symboliquement ; lisez la section TL;DR ci-dessous…

TL;DR

Remplacez ‘‘${my_user}’’ par votre identifiant de session !

=> Pour virtualenv :
# mkdir -p /usr/local/${my_user}/python
# chown -R ${my_user}:wheel /usr/local/${my_user}
# ln -s /usr/local/${my_user}/python $home/python

=> Pour pipenv, il faut rajouter à ce qui suit au-dessus :
$ mkdir /usr/local/$USER/python/virtualenvs
$ ln -s /usr/local/$USER/python/virtualenvs $HOME/.local/share/virtualenvs

Documentations

Remerciements

  • Ce tutoriel n’existerait pas sans Xavier
  • et, sans cet article anglais, nommé “Using cabal on OpenBSD